Content-addressed version deploy system for Diffuse elements.diffuse.sh
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: deploy 4.0.0-alpha update

+15858 -2
+5
artifacts/artifacts.json
··· 108 108 "cid": "bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq", 109 109 "createdAt": "2026-02-16T18:22:12.701Z", 110 110 "version": "4.0.0-alpha" 111 + }, 112 + "bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy": { 113 + "cid": "bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy", 114 + "createdAt": "2026-02-17T23:18:54.123Z", 115 + "version": "4.0.0-alpha" 111 116 } 112 117 }
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/APEv2Parser-BRKJRV7N.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/APEv2Parser-BRKJRV7N.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/APEv2Parser-BRKJRV7N.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/APEv2Parser-BRKJRV7N.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/AiffParser-TQ5FJFYY.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AiffParser-TQ5FJFYY.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/AiffParser-TQ5FJFYY.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AiffParser-TQ5FJFYY.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/AsfParser-ROMHQSZ4.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AsfParser-ROMHQSZ4.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/AsfParser-ROMHQSZ4.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AsfParser-ROMHQSZ4.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/DsdiffParser-IPZ4LJVB.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsdiffParser-IPZ4LJVB.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/DsdiffParser-IPZ4LJVB.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsdiffParser-IPZ4LJVB.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/DsfParser-3LJNLQO5.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsfParser-3LJNLQO5.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/DsfParser-3LJNLQO5.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsfParser-3LJNLQO5.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/FlacParser-CORWQOPJ.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/FlacParser-CORWQOPJ.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/FlacParser-CORWQOPJ.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/FlacParser-CORWQOPJ.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MP4Parser-Z47EMV4S.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MP4Parser-Z47EMV4S.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MP4Parser-Z47EMV4S.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MP4Parser-Z47EMV4S.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MatroskaParser-AYAGCKYO.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/MatroskaParser-AYAGCKYO.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MatroskaParser-AYAGCKYO.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/MatroskaParser-AYAGCKYO.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MpegParser-OHXYR6LX.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MpegParser-OHXYR6LX.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MpegParser-OHXYR6LX.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MpegParser-OHXYR6LX.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MusepackParser-J3NHX4UP.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MusepackParser-J3NHX4UP.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/MusepackParser-J3NHX4UP.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MusepackParser-J3NHX4UP.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/OggParser-IPNXVFB4.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/OggParser-IPNXVFB4.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/OggParser-IPNXVFB4.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/OggParser-IPNXVFB4.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/WavPackParser-7DDX5KAZ.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WavPackParser-7DDX5KAZ.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/WavPackParser-7DDX5KAZ.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WavPackParser-7DDX5KAZ.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/WaveParser-TGWUU72U.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WaveParser-TGWUU72U.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/WaveParser-TGWUU72U.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WaveParser-TGWUU72U.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/android-chrome-192x192.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-192x192.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/android-chrome-512x512.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-512x512.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/apple-touch-icon.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/apple-touch-icon.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/browserconfig.xml
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/browserconfig.xml
+120
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-2726SF3Z.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + __name, 6 + init_Buffer, 7 + init_process 8 + } from "./chunk-FZQXS3RE.js"; 9 + 10 + // themes/webamp/window/element.js 11 + init_Buffer(); 12 + init_process(); 13 + var WindowElement = class extends DiffuseElement { 14 + static { 15 + __name(this, "WindowElement"); 16 + } 17 + static observedAttributes = ["open"]; 18 + constructor() { 19 + super(); 20 + this.id = this.id?.length ? this.id : crypto.randomUUID(); 21 + this.attachShadow({ mode: "open" }); 22 + } 23 + // ACTIONS 24 + activate() { 25 + this.shadowRoot?.querySelector(".title-bar")?.classList.remove("inactive"); 26 + } 27 + deactivate() { 28 + this.shadowRoot?.querySelector(".title-bar")?.classList.add("inactive"); 29 + } 30 + // RENDER 31 + /** 32 + * @param {RenderArg} _ 33 + */ 34 + render({ html }) { 35 + return html` 36 + <link rel="stylesheet" href="styles/vendor/98.css" /> 37 + 38 + <style> 39 + dialog { 40 + background: transparent; 41 + border: 0; 42 + padding: 0; 43 + } 44 + 45 + .window-body { 46 + min-width: 350px; 47 + overflow: hidden; 48 + resize: both; 49 + } 50 + 51 + .title-bar { 52 + justify-content: unset; 53 + user-select: none; 54 + } 55 + 56 + .title-bar-icon { 57 + margin-right: 4px; 58 + } 59 + 60 + .title-bar-text { 61 + flex: 1; 62 + } 63 + </style> 64 + 65 + <dialog ?open="${this.hasAttribute("open")}"> 66 + <div class="window"> 67 + <div 68 + class="title-bar" 69 + @mousedown="${this.titleBarMouseDown.bind(this)}" 70 + > 71 + <div class="title-bar-icon"> 72 + <slot name="title-icon"></slot> 73 + </div> 74 + <div class="title-bar-text" draggable="false"> 75 + <slot name="title"></slot> 76 + </div> 77 + <div class="title-bar-controls"> 78 + <!--<button aria-label="Minimize"></button>--> 79 + <!--<button aria-label="Maximize"></button>--> 80 + <button aria-label="Close" @click="${() => this.removeAttribute("open")}"></button> 81 + </div> 82 + </div> 83 + <div class="window-body" style="${this.getAttribute(`window-style`) ?? ``}"> 84 + <slot></slot> 85 + </div> 86 + </div> 87 + </dialog> 88 + `; 89 + } 90 + // EVENTS 91 + /** 92 + * @param {MouseEvent} mouse 93 + */ 94 + titleBarMouseDown(mouse) { 95 + const event = new CustomEvent("dtw-window-start-move", { 96 + bubbles: true, 97 + composed: true, 98 + detail: { 99 + element: this, 100 + x: mouse.x, 101 + xElement: mouse.layerX, 102 + y: mouse.y, 103 + yElement: mouse.layerY 104 + } 105 + }); 106 + this.dispatchEvent(event); 107 + } 108 + }; 109 + var element_default = WindowElement; 110 + var CLASS = WindowElement; 111 + var NAME = "dtw-window"; 112 + customElements.define(NAME, WindowElement); 113 + 114 + export { 115 + element_default, 116 + CLASS, 117 + NAME 118 + }; 119 + 120 + //# sourceMappingURL=./chunk-2726SF3Z.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-2726SF3Z.js.map
··· 1 + {"version":3,"sources":["/themes/webamp/window/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass WindowElement extends DiffuseElement {\n static observedAttributes = [\"open\"];\n\n constructor() {\n super();\n\n this.id = this.id?.length ? this.id : crypto.randomUUID();\n this.attachShadow({ mode: \"open\" });\n }\n\n // ACTIONS\n\n activate() {\n this.shadowRoot?.querySelector(\".title-bar\")?.classList.remove(\"inactive\");\n }\n\n deactivate() {\n this.shadowRoot?.querySelector(\".title-bar\")?.classList.add(\"inactive\");\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <link rel=\"stylesheet\" href=\"styles/vendor/98.css\" />\n\n <style>\n dialog {\n background: transparent;\n border: 0;\n padding: 0;\n }\n\n .window-body {\n min-width: 350px;\n overflow: hidden;\n resize: both;\n }\n\n .title-bar {\n justify-content: unset;\n user-select: none;\n }\n\n .title-bar-icon {\n margin-right: 4px;\n }\n\n .title-bar-text {\n flex: 1;\n }\n </style>\n\n <dialog ?open=\"${this.hasAttribute(\"open\")}\">\n <div class=\"window\">\n <div\n class=\"title-bar\"\n @mousedown=\"${this.titleBarMouseDown.bind(this)}\"\n >\n <div class=\"title-bar-icon\">\n <slot name=\"title-icon\"></slot>\n </div>\n <div class=\"title-bar-text\" draggable=\"false\">\n <slot name=\"title\"></slot>\n </div>\n <div class=\"title-bar-controls\">\n <!--<button aria-label=\"Minimize\"></button>-->\n <!--<button aria-label=\"Maximize\"></button>-->\n <button aria-label=\"Close\" @click=\"${() =>\n this.removeAttribute(\"open\")}\"></button>\n </div>\n </div>\n <div class=\"window-body\" style=\"${this.getAttribute(`window-style`) ??\n ``}\">\n <slot></slot>\n </div>\n </div>\n </dialog>\n `;\n }\n\n // EVENTS\n\n /**\n * @param {MouseEvent} mouse\n */\n titleBarMouseDown(mouse) {\n const event = new CustomEvent(\"dtw-window-start-move\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this,\n x: mouse.x,\n xElement: mouse.layerX,\n y: mouse.y,\n yElement: mouse.layerY,\n },\n });\n\n this.dispatchEvent(event);\n }\n}\n\nexport default WindowElement;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = WindowElement;\nexport const NAME = \"dtw-window\";\n\ncustomElements.define(NAME, WindowElement);\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAUA,IAAM,gBAAN,cAA4B,eAAe;AAAA,EAV3C,OAU2C;AAAA;AAAA;AAAA,EACzC,OAAO,qBAAqB,CAAC,MAAM;AAAA,EAEnC,cAAc;AACZ,UAAM;AAEN,SAAK,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,OAAO,WAAW;AACxD,SAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAAA,EACpC;AAAA;AAAA,EAIA,WAAW;AACT,SAAK,YAAY,cAAc,YAAY,GAAG,UAAU,OAAO,UAAU;AAAA,EAC3E;AAAA,EAEA,aAAa;AACX,SAAK,YAAY,cAAc,YAAY,GAAG,UAAU,IAAI,UAAU;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,EAAE,KAAK,GAAG;AACf,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBA8BY,KAAK,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA,0BAItB,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mDAWR,MACnC,KAAK,gBAAgB,MAAM,CAAC;AAAA;AAAA;AAAA,4CAGA,KAAK,aAAa,cAAc,KAChE,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,OAAO;AACvB,UAAM,QAAQ,IAAI,YAAY,yBAAyB;AAAA,MACrD,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,GAAG,MAAM;AAAA,QACT,UAAU,MAAM;AAAA,QAChB,GAAG,MAAM;AAAA,QACT,UAAU,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAED,SAAK,cAAc,KAAK;AAAA,EAC1B;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,aAAa;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-2726SF3Z.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-2E662X3X.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-2E662X3X.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3CXPPL5Z.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3CXPPL5Z.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js.map
+122
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3G4WUGDN.js
··· 1 + import { 2 + DiffuseElement, 3 + query 4 + } from "./chunk-H46AZIKM.js"; 5 + import { 6 + computed, 7 + signal 8 + } from "./chunk-IZOBPV2S.js"; 9 + import { 10 + __name, 11 + init_Buffer, 12 + init_process 13 + } from "./chunk-FZQXS3RE.js"; 14 + 15 + // components/transformer/output/base.js 16 + init_Buffer(); 17 + init_process(); 18 + var OutputTransformer = class extends DiffuseElement { 19 + static { 20 + __name(this, "OutputTransformer"); 21 + } 22 + // SIGNALS 23 + #output = signal( 24 + /** @type {OutputElement<T> | undefined} */ 25 + void 0 26 + ); 27 + #outputWhenDefined = Promise.withResolvers(); 28 + output = { 29 + whenDefined: this.#outputWhenDefined.promise, 30 + signal: this.#output.get 31 + }; 32 + // LIFECYCLE 33 + /** 34 + * @override 35 + */ 36 + connectedCallback() { 37 + super.connectedCallback(); 38 + const output = query(this, "output-selector"); 39 + customElements.whenDefined(output.localName).then(() => { 40 + this.#output.value = output; 41 + this.#outputWhenDefined.resolve(null); 42 + }); 43 + } 44 + // MANAGER 45 + base() { 46 + const m = { 47 + facets: { 48 + collection: computed(() => { 49 + return this.output.signal()?.facets?.collection(); 50 + }), 51 + reload: /* @__PURE__ */ __name(() => { 52 + return this.output.signal()?.facets?.reload() ?? Promise.resolve(); 53 + }, "reload"), 54 + save: /* @__PURE__ */ __name(async (newFacets) => { 55 + if (newFacets === void 0) return; 56 + await this.output.whenDefined; 57 + await this.output.signal()?.facets.save(newFacets); 58 + }, "save"), 59 + state: computed(() => { 60 + return this.output.signal()?.facets.state() ?? "sleeping"; 61 + }) 62 + }, 63 + playlists: { 64 + collection: computed(() => { 65 + return this.output.signal()?.playlists?.collection(); 66 + }), 67 + reload: /* @__PURE__ */ __name(() => { 68 + return this.output.signal()?.playlists?.reload() ?? Promise.resolve(); 69 + }, "reload"), 70 + save: /* @__PURE__ */ __name(async (newPlaylists) => { 71 + if (newPlaylists === void 0) return; 72 + await this.output.whenDefined; 73 + await this.output.signal()?.playlists.save(newPlaylists); 74 + }, "save"), 75 + state: computed(() => { 76 + return this.output.signal()?.playlists.state() ?? "sleeping"; 77 + }) 78 + }, 79 + themes: { 80 + collection: computed(() => { 81 + return this.output.signal()?.themes?.collection(); 82 + }), 83 + reload: /* @__PURE__ */ __name(() => { 84 + return this.output.signal()?.themes?.reload() ?? Promise.resolve(); 85 + }, "reload"), 86 + save: /* @__PURE__ */ __name(async (newThemes) => { 87 + if (newThemes === void 0) return; 88 + await this.output.whenDefined; 89 + await this.output.signal()?.themes.save(newThemes); 90 + }, "save"), 91 + state: computed(() => { 92 + return this.output.signal()?.themes.state() ?? "sleeping"; 93 + }) 94 + }, 95 + tracks: { 96 + collection: computed(() => { 97 + return this.output.signal()?.tracks?.collection(); 98 + }), 99 + reload: /* @__PURE__ */ __name(() => { 100 + return this.output.signal()?.tracks?.reload() ?? Promise.resolve(); 101 + }, "reload"), 102 + save: /* @__PURE__ */ __name(async (newTracks) => { 103 + if (newTracks === void 0) return; 104 + await this.output.whenDefined; 105 + await this.output.signal()?.tracks.save(newTracks); 106 + }, "save"), 107 + state: computed(() => { 108 + return this.output.signal()?.tracks.state() ?? "sleeping"; 109 + }) 110 + }, 111 + // Other non-data related state 112 + ready: computed(() => this.output.signal()?.ready() ?? false) 113 + }; 114 + return m; 115 + } 116 + }; 117 + 118 + export { 119 + OutputTransformer 120 + }; 121 + 122 + //# sourceMappingURL=./chunk-3G4WUGDN.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3G4WUGDN.js.map
··· 1 + {"version":3,"sources":["/components/transformer/output/base.js"],"sourcesContent":["import { DiffuseElement, query } from \"@common/element.js\";\nimport { computed, signal } from \"@common/signal.js\";\n\n/**\n * @import { OutputElement, OutputManagerDeputy } from \"../../output/types.d.ts\"\n */\n\n/**\n * @template [T=null]\n */\nexport class OutputTransformer extends DiffuseElement {\n // SIGNALS\n\n #output = signal(/** @type {OutputElement<T> | undefined} */ (undefined));\n #outputWhenDefined = Promise.withResolvers();\n\n output = {\n whenDefined: this.#outputWhenDefined.promise,\n signal: this.#output.get,\n };\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n /** @type {OutputElement<T>} */\n const output = query(this, \"output-selector\");\n\n // When defined\n customElements.whenDefined(output.localName).then(() => {\n this.#output.value = output;\n this.#outputWhenDefined.resolve(null);\n });\n }\n\n // MANAGER\n\n base() {\n /** @type {OutputManagerDeputy<T | undefined>} */\n const m = {\n facets: {\n collection: computed(() => {\n return this.output.signal()?.facets?.collection();\n }),\n reload: () => {\n return this.output.signal()?.facets?.reload() ??\n Promise.resolve();\n },\n save: async (newFacets) => {\n if (newFacets === undefined) return;\n await this.output.whenDefined;\n await this.output.signal()?.facets.save(newFacets);\n },\n state: computed(() => {\n return this.output.signal()?.facets.state() ?? \"sleeping\";\n }),\n },\n playlists: {\n collection: computed(() => {\n return this.output.signal()?.playlists?.collection();\n }),\n reload: () => {\n return this.output.signal()?.playlists?.reload() ??\n Promise.resolve();\n },\n save: async (newPlaylists) => {\n if (newPlaylists === undefined) return;\n await this.output.whenDefined;\n await this.output.signal()?.playlists.save(newPlaylists);\n },\n state: computed(() => {\n return this.output.signal()?.playlists.state() ?? \"sleeping\";\n }),\n },\n themes: {\n collection: computed(() => {\n return this.output.signal()?.themes?.collection();\n }),\n reload: () => {\n return this.output.signal()?.themes?.reload() ??\n Promise.resolve();\n },\n save: async (newThemes) => {\n if (newThemes === undefined) return;\n await this.output.whenDefined;\n await this.output.signal()?.themes.save(newThemes);\n },\n state: computed(() => {\n return this.output.signal()?.themes.state() ?? \"sleeping\";\n }),\n },\n tracks: {\n collection: computed(() => {\n return this.output.signal()?.tracks?.collection();\n }),\n reload: () => {\n return this.output.signal()?.tracks?.reload() ?? Promise.resolve();\n },\n save: async (newTracks) => {\n if (newTracks === undefined) return;\n await this.output.whenDefined;\n await this.output.signal()?.tracks.save(newTracks);\n },\n state: computed(() => {\n return this.output.signal()?.tracks.state() ?? \"sleeping\";\n }),\n },\n\n // Other non-data related state\n ready: computed(() => this.output.signal()?.ready() ?? false),\n };\n\n return m;\n }\n}\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-3G4WUGDN.js.map"}
+169
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3SF5BNF4.js
··· 1 + import { 2 + A, 3 + DEFAULT_GROUP, 4 + DiffuseElement 5 + } from "./chunk-H46AZIKM.js"; 6 + import { 7 + __name, 8 + init_Buffer, 9 + init_process 10 + } from "./chunk-FZQXS3RE.js"; 11 + 12 + // components/orchestrator/output/element.js 13 + init_Buffer(); 14 + init_process(); 15 + 16 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/directives/if-defined.js 17 + init_Buffer(); 18 + init_process(); 19 + var o = /* @__PURE__ */ __name((o2) => o2 ?? A, "o"); 20 + 21 + // components/orchestrator/output/element.js 22 + var OutputOrchestrator = class extends DiffuseElement { 23 + static { 24 + __name(this, "OutputOrchestrator"); 25 + } 26 + static NAME = "diffuse/orchestrator/output"; 27 + /** 28 + * @returns {OutputElement} 29 + */ 30 + get output() { 31 + const output = this.root().querySelector("#do-output__output"); 32 + if (!output) throw new Error("Output orchestrator did not render yet."); 33 + return output; 34 + } 35 + /** 36 + * @returns {OutputConfiguratorElement} 37 + */ 38 + get outputConfigurator() { 39 + const outputConfigurator = this.root().querySelector( 40 + "#do-output__dc-output" 41 + ); 42 + if (!outputConfigurator) { 43 + throw new Error("Output orchestrator did not render yet."); 44 + } 45 + return outputConfigurator; 46 + } 47 + // PROXY OUTPUT ACTIONS 48 + get facets() { 49 + return this.output.facets; 50 + } 51 + get playlists() { 52 + return this.output.playlists; 53 + } 54 + get themes() { 55 + return this.output.themes; 56 + } 57 + get tracks() { 58 + return this.output.tracks; 59 + } 60 + get ready() { 61 + return this.output.ready; 62 + } 63 + // PROXY ADDITIONAL OUTPUT CONFIGURATOR ACTIONS 64 + get deselect() { 65 + return this.outputConfigurator.deselect; 66 + } 67 + get options() { 68 + return this.outputConfigurator.options; 69 + } 70 + get select() { 71 + return this.outputConfigurator.select; 72 + } 73 + get selectedOutput() { 74 + return this.outputConfigurator.selectedOutput; 75 + } 76 + // RENDER 77 + /** 78 + * @param {RenderArg} _ 79 + */ 80 + render({ html }) { 81 + const group = this.group === DEFAULT_GROUP ? void 0 : this.group; 82 + return html` 83 + <!-- DEFAULT --> 84 + <dop-indexed-db 85 + id="do-output__dop-indexed-db__json" 86 + group="${o(group)}" 87 + namespace="json" 88 + ></dop-indexed-db> 89 + 90 + <!-- S3 #2 --> 91 + <dc-output-fallback 92 + id="do-output__dob-s3-fallback" 93 + > 94 + <dob-s3 95 + id="do-output__dob-s3" 96 + group="${o(group)}" 97 + ></dob-s3> 98 + <dop-indexed-db 99 + id="do-output__dop-indexed-db__s3" 100 + group="${o(group)}" 101 + namespace="s3" 102 + ></dop-indexed-db> 103 + </dc-output-fallback> 104 + 105 + <!-- OUTPUT CONFIGURATOR --> 106 + <dc-output 107 + id="do-output__dc-output" 108 + default="do-output__dc-output__local" 109 + group="${o(group)}" 110 + > 111 + <dtos-json 112 + id="do-output__dc-output__local" 113 + output-selector="#do-output__dop-indexed-db__json" 114 + label="Local" 115 + ></dtos-json> 116 + 117 + <!-- ATProto --> 118 + <dc-output-fallback 119 + id="do-output__dc-output__atproto" 120 + label="AT Protocol" 121 + > 122 + <dor-atproto 123 + id="do-output__dor-atproto" 124 + group="${o(group)}" 125 + ></dor-atproto> 126 + <dop-indexed-db 127 + id="do-output__dop-indexed-db__atproto" 128 + group="${o(group)}" 129 + namespace="atproto" 130 + ></dop-indexed-db> 131 + </dc-output-fallback> 132 + 133 + <!-- S3 #1 --> 134 + <dtob-automerge 135 + id="do-output__dc-output__s3" 136 + output-selector="#do-output__dob-s3-fallback" 137 + label="S3" 138 + ></dtob-automerge> 139 + </dc-output> 140 + 141 + <!-- Entry --> 142 + <dtor-default 143 + id="do-output__output" 144 + output-selector="#do-output__dc-output" 145 + ></dtor-default> 146 + `; 147 + } 148 + }; 149 + var element_default = OutputOrchestrator; 150 + var CLASS = OutputOrchestrator; 151 + var NAME = "do-output"; 152 + customElements.define(NAME, CLASS); 153 + 154 + export { 155 + element_default, 156 + CLASS, 157 + NAME 158 + }; 159 + /*! Bundled license information: 160 + 161 + lit-html/node/directives/if-defined.js: 162 + (** 163 + * @license 164 + * Copyright 2018 Google LLC 165 + * SPDX-License-Identifier: BSD-3-Clause 166 + *) 167 + */ 168 + 169 + //# sourceMappingURL=./chunk-3SF5BNF4.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3SF5BNF4.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/output/element.js","/node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/src/directives/if-defined.ts"],"sourcesContent":["import { ifDefined } from \"lit-html/directives/if-defined.js\";\nimport { DEFAULT_GROUP, DiffuseElement } from \"@common/element.js\";\n\nimport \"@components/configurator/output/element.js\";\nimport \"@components/configurator/output-fallback/element.js\";\nimport \"@components/output/bytes/s3/element.js\";\nimport \"@components/output/polymorphic/indexed-db/element.js\";\nimport \"@components/output/raw/atproto/element.js\";\nimport \"@components/transformer/output/bytes/automerge/element.js\";\nimport \"@components/transformer/output/refiner/default/element.js\";\nimport \"@components/transformer/output/string/json/element.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n * @import {OutputConfiguratorElement} from \"@components/configurator/output/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * A default setup for managing output.\n *\n * @implements {OutputConfiguratorElement}\n */\nclass OutputOrchestrator extends DiffuseElement {\n static NAME = \"diffuse/orchestrator/output\";\n\n /**\n * @returns {OutputElement}\n */\n get output() {\n /** @type {OutputElement | null} */\n const output = this.root().querySelector(\"#do-output__output\");\n\n if (!output) throw new Error(\"Output orchestrator did not render yet.\");\n return output;\n }\n\n /**\n * @returns {OutputConfiguratorElement}\n */\n get outputConfigurator() {\n /** @type {OutputConfiguratorElement | null} */\n const outputConfigurator = this.root().querySelector(\n \"#do-output__dc-output\",\n );\n\n if (!outputConfigurator) {\n throw new Error(\"Output orchestrator did not render yet.\");\n }\n return outputConfigurator;\n }\n\n // PROXY OUTPUT ACTIONS\n\n get facets() {\n return this.output.facets;\n }\n\n get playlists() {\n return this.output.playlists;\n }\n\n get themes() {\n return this.output.themes;\n }\n\n get tracks() {\n return this.output.tracks;\n }\n\n get ready() {\n return this.output.ready;\n }\n\n // PROXY ADDITIONAL OUTPUT CONFIGURATOR ACTIONS\n\n get deselect() {\n return this.outputConfigurator.deselect;\n }\n\n get options() {\n return this.outputConfigurator.options;\n }\n\n get select() {\n return this.outputConfigurator.select;\n }\n\n get selectedOutput() {\n return this.outputConfigurator.selectedOutput;\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n const group = this.group === DEFAULT_GROUP ? undefined : this.group;\n\n return html`\n <!-- DEFAULT -->\n <dop-indexed-db\n id=\"do-output__dop-indexed-db__json\"\n group=\"${ifDefined(group)}\"\n namespace=\"json\"\n ></dop-indexed-db>\n\n <!-- S3 #2 -->\n <dc-output-fallback\n id=\"do-output__dob-s3-fallback\"\n >\n <dob-s3\n id=\"do-output__dob-s3\"\n group=\"${ifDefined(group)}\"\n ></dob-s3>\n <dop-indexed-db\n id=\"do-output__dop-indexed-db__s3\"\n group=\"${ifDefined(group)}\"\n namespace=\"s3\"\n ></dop-indexed-db>\n </dc-output-fallback>\n\n <!-- OUTPUT CONFIGURATOR -->\n <dc-output\n id=\"do-output__dc-output\"\n default=\"do-output__dc-output__local\"\n group=\"${ifDefined(group)}\"\n >\n <dtos-json\n id=\"do-output__dc-output__local\"\n output-selector=\"#do-output__dop-indexed-db__json\"\n label=\"Local\"\n ></dtos-json>\n\n <!-- ATProto -->\n <dc-output-fallback\n id=\"do-output__dc-output__atproto\"\n label=\"AT Protocol\"\n >\n <dor-atproto\n id=\"do-output__dor-atproto\"\n group=\"${ifDefined(group)}\"\n ></dor-atproto>\n <dop-indexed-db\n id=\"do-output__dop-indexed-db__atproto\"\n group=\"${ifDefined(group)}\"\n namespace=\"atproto\"\n ></dop-indexed-db>\n </dc-output-fallback>\n\n <!-- S3 #1 -->\n <dtob-automerge\n id=\"do-output__dc-output__s3\"\n output-selector=\"#do-output__dob-s3-fallback\"\n label=\"S3\"\n ></dtob-automerge>\n </dc-output>\n\n <!-- Entry -->\n <dtor-default\n id=\"do-output__output\"\n output-selector=\"#do-output__dc-output\"\n ></dtor-default>\n `;\n }\n}\n\nexport default OutputOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = OutputOrchestrator;\nexport const NAME = \"do-output\";\n\ncustomElements.define(NAME, CLASS);\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {nothing} from '../lit-html.js';\n\n/**\n * For AttributeParts, sets the attribute if the value is defined and removes\n * the attribute if the value is undefined.\n *\n * For other part types, this directive is a no-op.\n */\nexport const ifDefined = <T>(value: T) => value ?? nothing;\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;A;;;;ACcO,IAAMA,IAAgBC,wBAAAA,OAAaA,MAASC,GAAtBD;;;ADa7B,IAAM,qBAAN,cAAiC,eAAe;AAAA,EA3BhD,OA2BgD;AAAA;AAAA;AAAA,EAC9C,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA,EAKd,IAAI,SAAS;AAEX,UAAM,SAAS,KAAK,KAAK,EAAE,cAAc,oBAAoB;AAE7D,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,yCAAyC;AACtE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,qBAAqB;AAEvB,UAAM,qBAAqB,KAAK,KAAK,EAAE;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,CAAC,oBAAoB;AACvB,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,IAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA,EAIA,IAAI,WAAW;AACb,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,EAAE,KAAK,GAAG;AACf,UAAM,QAAQ,KAAK,UAAU,gBAAgB,SAAY,KAAK;AAE9D,WAAO;AAAA;AAAA;AAAA;AAAA,iBAIM,EAAU,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAUd,EAAU,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,mBAIhB,EAAU,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBASlB,EAAU,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAeZ,EAAU,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,qBAIhB,EAAU,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBnC;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":["ifDefined","value","nothing"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-3SF5BNF4.js.map"}
+75
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3VP55W4C.js
··· 1 + import { 2 + BroadcastableDiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + signal 6 + } from "./chunk-IZOBPV2S.js"; 7 + import { 8 + __name, 9 + init_Buffer, 10 + init_process 11 + } from "./chunk-FZQXS3RE.js"; 12 + 13 + // components/engine/repeat-shuffle/element.js 14 + init_Buffer(); 15 + init_process(); 16 + var RepeatShuffleEngine = class extends BroadcastableDiffuseElement { 17 + static { 18 + __name(this, "RepeatShuffleEngine"); 19 + } 20 + static NAME = "diffuse/engine/repeat-shuffle"; 21 + // SIGNALS 22 + #repeat = signal(false); 23 + #shuffle = signal(false); 24 + repeat = this.#repeat.get; 25 + shuffle = this.#shuffle.get; 26 + // LIFECYCLE 27 + /** 28 + * @override 29 + */ 30 + connectedCallback() { 31 + if (this.hasAttribute("group")) { 32 + const actions = this.broadcast(this.nameWithGroup, { 33 + setRepeat: { strategy: "replicate", fn: this.setRepeat }, 34 + setShuffle: { strategy: "replicate", fn: this.setShuffle } 35 + }); 36 + if (actions) { 37 + this.setRepeat = actions.setRepeat; 38 + this.setShuffle = actions.setShuffle; 39 + } 40 + } 41 + super.connectedCallback(); 42 + const storagePrefix = `${this.constructor.prototype.constructor.NAME}/${this.group}/`; 43 + this.#repeat.value = localStorage.getItem(`${storagePrefix}/repeat`) === "true" ? true : false; 44 + this.#shuffle.value = localStorage.getItem(`${storagePrefix}/shuffle`) === "true" ? true : false; 45 + this.effect( 46 + () => localStorage.setItem( 47 + `${storagePrefix}/repeat`, 48 + this.#repeat.value ? "true" : "false" 49 + ) 50 + ); 51 + this.effect( 52 + () => localStorage.setItem( 53 + `${storagePrefix}/shuffle`, 54 + this.#shuffle.value ? "true" : "false" 55 + ) 56 + ); 57 + } 58 + // ACTIONS 59 + /** @param {boolean} bool */ 60 + setRepeat = /* @__PURE__ */ __name(async (bool) => this.#repeat.value = bool, "setRepeat"); 61 + /** @param {boolean} bool */ 62 + setShuffle = /* @__PURE__ */ __name(async (bool) => this.#shuffle.value = bool, "setShuffle"); 63 + }; 64 + var element_default = RepeatShuffleEngine; 65 + var CLASS = RepeatShuffleEngine; 66 + var NAME = "de-repeat-shuffle"; 67 + customElements.define(NAME, CLASS); 68 + 69 + export { 70 + element_default, 71 + CLASS, 72 + NAME 73 + }; 74 + 75 + //# sourceMappingURL=./chunk-3VP55W4C.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-3VP55W4C.js.map
··· 1 + {"version":3,"sources":["/components/engine/repeat-shuffle/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass RepeatShuffleEngine extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/engine/repeat-shuffle\";\n\n // SIGNALS\n\n #repeat = signal(false);\n #shuffle = signal(false);\n\n repeat = this.#repeat.get;\n shuffle = this.#shuffle.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n setRepeat: { strategy: \"replicate\", fn: this.setRepeat },\n setShuffle: { strategy: \"replicate\", fn: this.setShuffle },\n });\n\n if (actions) {\n this.setRepeat = actions.setRepeat;\n this.setShuffle = actions.setShuffle;\n }\n }\n\n // Super\n super.connectedCallback();\n\n // Signals\n const storagePrefix =\n `${this.constructor.prototype.constructor.NAME}/${this.group}/`;\n\n this.#repeat.value =\n localStorage.getItem(`${storagePrefix}/repeat`) === \"true\" ? true : false;\n this.#shuffle.value =\n localStorage.getItem(`${storagePrefix}/shuffle`) === \"true\"\n ? true\n : false;\n\n // Effects\n this.effect(() =>\n localStorage.setItem(\n `${storagePrefix}/repeat`,\n this.#repeat.value ? \"true\" : \"false\",\n )\n );\n\n this.effect(() =>\n localStorage.setItem(\n `${storagePrefix}/shuffle`,\n this.#shuffle.value ? \"true\" : \"false\",\n )\n );\n }\n\n // ACTIONS\n\n /** @param {boolean} bool */\n setRepeat = async (bool) => this.#repeat.value = bool;\n\n /** @param {boolean} bool */\n setShuffle = async (bool) => this.#shuffle.value = bool;\n}\n\nexport default RepeatShuffleEngine;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = RepeatShuffleEngine;\nexport const NAME = \"de-repeat-shuffle\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAOA,IAAM,sBAAN,cAAkC,4BAA4B;AAAA,EAP9D,OAO8D;AAAA;AAAA;AAAA,EAC5D,OAAO,OAAO;AAAA;AAAA,EAId,UAAU,OAAO,KAAK;AAAA,EACtB,WAAW,OAAO,KAAK;AAAA,EAEvB,SAAS,KAAK,QAAQ;AAAA,EACtB,UAAU,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,oBAAoB;AAElB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,YAAM,UAAU,KAAK,UAAU,KAAK,eAAe;AAAA,QACjD,WAAW,EAAE,UAAU,aAAa,IAAI,KAAK,UAAU;AAAA,QACvD,YAAY,EAAE,UAAU,aAAa,IAAI,KAAK,WAAW;AAAA,MAC3D,CAAC;AAED,UAAI,SAAS;AACX,aAAK,YAAY,QAAQ;AACzB,aAAK,aAAa,QAAQ;AAAA,MAC5B;AAAA,IACF;AAGA,UAAM,kBAAkB;AAGxB,UAAM,gBACJ,GAAG,KAAK,YAAY,UAAU,YAAY,IAAI,IAAI,KAAK,KAAK;AAE9D,SAAK,QAAQ,QACX,aAAa,QAAQ,GAAG,aAAa,SAAS,MAAM,SAAS,OAAO;AACtE,SAAK,SAAS,QACZ,aAAa,QAAQ,GAAG,aAAa,UAAU,MAAM,SACjD,OACA;AAGN,SAAK;AAAA,MAAO,MACV,aAAa;AAAA,QACX,GAAG,aAAa;AAAA,QAChB,KAAK,QAAQ,QAAQ,SAAS;AAAA,MAChC;AAAA,IACF;AAEA,SAAK;AAAA,MAAO,MACV,aAAa;AAAA,QACX,GAAG,aAAa;AAAA,QAChB,KAAK,SAAS,QAAQ,SAAS;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,YAAY,8BAAO,SAAS,KAAK,QAAQ,QAAQ,MAArC;AAAA;AAAA,EAGZ,aAAa,8BAAO,SAAS,KAAK,SAAS,QAAQ,MAAtC;AACf;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-3VP55W4C.js.map"}
+59
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4EGXANKE.js
··· 1 + import { 2 + bucketsFromTracks, 3 + buildURI 4 + } from "./chunk-AISBWLUT.js"; 5 + import { 6 + SCHEME 7 + } from "./chunk-GX3WPNEX.js"; 8 + import { 9 + DiffuseElement 10 + } from "./chunk-H46AZIKM.js"; 11 + import { 12 + __name, 13 + init_Buffer, 14 + init_process 15 + } from "./chunk-FZQXS3RE.js"; 16 + 17 + // components/input/s3/element.js 18 + init_Buffer(); 19 + init_process(); 20 + var S3Input = class extends DiffuseElement { 21 + static { 22 + __name(this, "S3Input"); 23 + } 24 + static NAME = "diffuse/input/s3"; 25 + static WORKER_URL = "components/input/s3/worker.js"; 26 + SCHEME = SCHEME; 27 + constructor() { 28 + super(); 29 + this.proxy = this.workerProxy(); 30 + this.consult = this.proxy.consult; 31 + this.detach = this.proxy.detach; 32 + this.groupConsult = this.proxy.groupConsult; 33 + this.list = this.proxy.list; 34 + this.resolve = this.proxy.resolve; 35 + this.demo = this.proxy.demo; 36 + } 37 + // 🛠️ 38 + /** @param {Track[]} tracks */ 39 + sources(tracks) { 40 + return Object.values(bucketsFromTracks(tracks)).map((server) => { 41 + return { 42 + label: `${server.bucketName} (${server.host})`, 43 + uri: buildURI(server) 44 + }; 45 + }); 46 + } 47 + }; 48 + var element_default = S3Input; 49 + var CLASS = S3Input; 50 + var NAME = "di-s3"; 51 + customElements.define(NAME, CLASS); 52 + 53 + export { 54 + element_default, 55 + CLASS, 56 + NAME 57 + }; 58 + 59 + //# sourceMappingURL=./chunk-4EGXANKE.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4EGXANKE.js.map
··· 1 + {"version":3,"sources":["/components/input/s3/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { SCHEME } from \"./constants.js\";\nimport { bucketsFromTracks, buildURI } from \"./common.js\";\n\n/**\n * @import {InputActions, InputSchemeProvider} from \"@components/input/types.d.ts\"\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n * @import {Demo} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<InputActions>}\n * @implements {InputSchemeProvider}\n */\nclass S3Input extends DiffuseElement {\n static NAME = \"diffuse/input/s3\";\n static WORKER_URL = \"components/input/s3/worker.js\";\n\n SCHEME = SCHEME;\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<InputActions & { demo: () => Demo }>} */\n this.proxy = this.workerProxy();\n\n this.consult = this.proxy.consult;\n this.detach = this.proxy.detach;\n this.groupConsult = this.proxy.groupConsult;\n this.list = this.proxy.list;\n this.resolve = this.proxy.resolve;\n\n this.demo = this.proxy.demo;\n }\n\n // 🛠️\n\n /** @param {Track[]} tracks */\n sources(tracks) {\n return Object.values(bucketsFromTracks(tracks)).map((server) => {\n return {\n label: `${server.bucketName} (${server.host})`,\n uri: buildURI(server),\n };\n });\n }\n}\n\nexport default S3Input;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = S3Input;\nexport const NAME = \"di-s3\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAmBA,IAAM,UAAN,cAAsB,eAAe;AAAA,EAnBrC,OAmBqC;AAAA;AAAA;AAAA,EACnC,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,SAAS;AAAA,EAET,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,KAAK,YAAY;AAE9B,SAAK,UAAU,KAAK,MAAM;AAC1B,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,eAAe,KAAK,MAAM;AAC/B,SAAK,OAAO,KAAK,MAAM;AACvB,SAAK,UAAU,KAAK,MAAM;AAE1B,SAAK,OAAO,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAQ;AACd,WAAO,OAAO,OAAO,kBAAkB,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW;AAC9D,aAAO;AAAA,QACL,OAAO,GAAG,OAAO,UAAU,KAAK,OAAO,IAAI;AAAA,QAC3C,KAAK,SAAS,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-4EGXANKE.js.map"}
+618
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4KKQSTV5.js
··· 1 + import { 2 + highlightTableEntry 3 + } from "./chunk-3CXPPL5Z.js"; 4 + import { 5 + buildURI as buildURI2 6 + } from "./chunk-AISBWLUT.js"; 7 + import { 8 + SCHEME as SCHEME3 9 + } from "./chunk-GX3WPNEX.js"; 10 + import { 11 + SCHEME 12 + } from "./chunk-HN4F5JEZ.js"; 13 + import { 14 + buildURI 15 + } from "./chunk-AGNDISJF.js"; 16 + import { 17 + SCHEME as SCHEME2 18 + } from "./chunk-EEUCFWD4.js"; 19 + import { 20 + A, 21 + DiffuseElement, 22 + query, 23 + queryOptional 24 + } from "./chunk-H46AZIKM.js"; 25 + import { 26 + signal 27 + } from "./chunk-IZOBPV2S.js"; 28 + import { 29 + __name, 30 + init_Buffer, 31 + init_process 32 + } from "./chunk-FZQXS3RE.js"; 33 + 34 + // themes/webamp/configurators/input/element.js 35 + init_Buffer(); 36 + init_process(); 37 + var InputConfig = class extends DiffuseElement { 38 + static { 39 + __name(this, "InputConfig"); 40 + } 41 + constructor() { 42 + super(); 43 + this.attachShadow({ mode: "open" }); 44 + } 45 + // SIGNALS 46 + $input = signal( 47 + /** @type {InputElement | undefined} */ 48 + void 0 49 + ); 50 + $output = signal( 51 + /** @type {OutputElement | undefined} */ 52 + void 0 53 + ); 54 + $sourcesOrchestrator = signal( 55 + /** @type {import("@components/orchestrator/sources/element.js").CLASS | undefined} */ 56 + void 0 57 + ); 58 + $processTracksOrchestrator = signal( 59 + /** @type {import("@components/orchestrator/process-tracks/element.js").CLASS | undefined} */ 60 + void 0 61 + ); 62 + $tab = signal("overview"); 63 + // LIFECYCLE 64 + /** 65 + * @override 66 + */ 67 + async connectedCallback() { 68 + super.connectedCallback(); 69 + const input = query(this, "input-selector"); 70 + const output = query(this, "output-selector"); 71 + const sourcesOrchestrator = query(this, "sources-orchestrator-selector"); 72 + const processTracksOrchestrator = queryOptional( 73 + this, 74 + "process-tracks-orchestrator-selector" 75 + ); 76 + await customElements.whenDefined(input.localName); 77 + await customElements.whenDefined(output.localName); 78 + await customElements.whenDefined(sourcesOrchestrator.localName); 79 + if (processTracksOrchestrator) { 80 + await customElements.whenDefined(processTracksOrchestrator.localName); 81 + } 82 + this.$input.value = input; 83 + this.$output.value = output; 84 + this.$sourcesOrchestrator.value = sourcesOrchestrator; 85 + if (processTracksOrchestrator) { 86 + this.$processTracksOrchestrator.value = processTracksOrchestrator; 87 + } 88 + } 89 + // EVENTS 90 + /** 91 + * @param {Event} event 92 + */ 93 + #addOpenSubsonicServer = /* @__PURE__ */ __name(async (event) => { 94 + event.preventDefault(); 95 + const button = this.root().querySelector("#opensubsonic-submit"); 96 + if (button) button.disabled = true; 97 + const host = this.formElement("opensubsonic-host")?.value; 98 + const tls = this.formElement("opensubsonic-tls")?.value === "true"; 99 + const username = this.formElement("opensubsonic-username")?.value; 100 + const password = this.formElement("opensubsonic-password")?.value; 101 + const apiKey = this.formElement("opensubsonic-apikey")?.value; 102 + if (!host) { 103 + throw new Error("Missing required `host` input value"); 104 + } 105 + const server = { 106 + host, 107 + tls, 108 + username, 109 + password, 110 + apiKey 111 + }; 112 + const uri = buildURI(server); 113 + await this.addSource(uri); 114 + if (button) button.disabled = false; 115 + }, "#addOpenSubsonicServer"); 116 + /** 117 + * @param {Event} event 118 + */ 119 + #addS3Bucket = /* @__PURE__ */ __name(async (event) => { 120 + event.preventDefault(); 121 + const button = this.root().querySelector("s3-submit"); 122 + if (button) button.disabled = true; 123 + const accessKey = this.formElement("s3-access-key")?.value; 124 + const bucketName = this.formElement("s3-bucket-name")?.value; 125 + const host = this.formElement("s3-host")?.value; 126 + const path = this.formElement("s3-path")?.value; 127 + const region = this.formElement("s3-region")?.value; 128 + const secretKey = this.formElement("s3-secret-key")?.value; 129 + if (!accessKey) { 130 + throw new Error("Missing required `accessKey` input value"); 131 + } 132 + if (!bucketName) { 133 + throw new Error("Missing required `bucketName` input value"); 134 + } 135 + if (!secretKey) { 136 + throw new Error("Missing required `secretKey` input value"); 137 + } 138 + const bucket = { 139 + accessKey, 140 + bucketName, 141 + host: host?.length ? host : "s3.amazonaws.com", 142 + path: path?.length ? path : "/", 143 + region: region?.length ? region : "us-east-1", 144 + secretKey 145 + }; 146 + const uri = buildURI2(bucket); 147 + await this.addSource(uri); 148 + if (button) button.disabled = false; 149 + }, "#addS3Bucket"); 150 + /** 151 + * @param {Event} event 152 + */ 153 + #addHttpsUrl = /* @__PURE__ */ __name(async (event) => { 154 + event.preventDefault(); 155 + const button = this.root().querySelector("#https-submit"); 156 + if (button) button.disabled = true; 157 + const url = this.formElement("https-url")?.value; 158 + if (!url) { 159 + throw new Error("Missing required `url` input value"); 160 + } 161 + await this.addSource(url); 162 + if (button) button.disabled = false; 163 + }, "#addHttpsUrl"); 164 + /** 165 + * @param {Event} event 166 + */ 167 + #deleteSelected = /* @__PURE__ */ __name(async (event) => { 168 + const button = ( 169 + /** @type {HTMLElement} */ 170 + event.target 171 + ); 172 + const fieldset = event.target ? button.closest("fieldset") : null; 173 + if (!fieldset) return; 174 + const selected = fieldset.querySelector( 175 + "table tr.highlighted" 176 + ); 177 + if (!selected) return; 178 + const uri = selected.getAttribute("data-uri"); 179 + if (!uri) throw new Error("Missing `uri` attribute"); 180 + const detachedTracks = await this.$input.value?.detach({ 181 + fileUriOrScheme: uri, 182 + tracks: this.$output.value?.tracks.collection() ?? [] 183 + }); 184 + if (detachedTracks) this.$output.value?.tracks.save(detachedTracks); 185 + }, "#deleteSelected"); 186 + /** @param {MouseEvent} event */ 187 + #highlightTableEntry(event) { 188 + highlightTableEntry(event); 189 + const fieldset = event.target ? ( 190 + /** @type {HTMLElement} */ 191 + event.target.closest("fieldset") 192 + ) : null; 193 + if (!fieldset) return; 194 + fieldset.querySelector('button[role="delete"]')?.removeAttribute( 195 + "disabled" 196 + ); 197 + } 198 + // 🛠️ 199 + /** 200 + * @param {string} uri 201 + */ 202 + async addSource(uri) { 203 + const track = { 204 + $type: "sh.diffuse.output.track", 205 + id: crypto.randomUUID(), 206 + kind: "placeholder", 207 + uri 208 + }; 209 + await this.$output.value?.tracks.save( 210 + [...this.$output.value?.tracks.collection() ?? [], track] 211 + ); 212 + this.$tab.value = "overview"; 213 + } 214 + /** 215 + * @param {string} id 216 + * @returns {HTMLInputElement | null} 217 + */ 218 + formElement(id) { 219 + return this.root().querySelector(`#${id}`); 220 + } 221 + // RENDER 222 + /** 223 + * @param {RenderArg} _ 224 + */ 225 + render({ html }) { 226 + return html` 227 + <link rel="stylesheet" href="styles/vendor/98.css" /> 228 + <link rel="stylesheet" href="themes/webamp/98-extra.css" /> 229 + 230 + <style> 231 + @import "./themes/webamp/98-vars.css"; 232 + 233 + #tabbed { 234 + display: flex; 235 + flex-direction: column; 236 + height: 100%; 237 + } 238 + 239 + fieldset { 240 + margin-bottom: var(--element-spacing); 241 + } 242 + 243 + .window { 244 + flex: 1; 245 + overflow-y: auto; 246 + } 247 + 248 + /* TABS */ 249 + 250 + menu[role="tablist"] { 251 + padding-top: 2px; 252 + 253 + li > label { 254 + cursor: pointer; 255 + display: block; 256 + padding: var(--radio-label-spacing); 257 + } 258 + 259 + li[aria-selected="true"] { 260 + padding-bottom: 2px; 261 + margin-top: -2px; 262 + background-color: var(--surface); 263 + position: relative; 264 + z-index: 8; 265 + margin-left: -3px; 266 + } 267 + } 268 + 269 + /* LIST */ 270 + 271 + table { 272 + color: black; 273 + table-layout: fixed; 274 + } 275 + 276 + table td { 277 + overflow: hidden; 278 + text-overflow: ellipsis; 279 + } 280 + 281 + table tbody tr { 282 + cursor: pointer; 283 + } 284 + 285 + /* FORMS */ 286 + 287 + input, select, textarea { 288 + flex: 1; 289 + } 290 + </style> 291 + 292 + <div id="tabbed"> 293 + <menu role="tablist" class="multirows"> 294 + <li role="tab" aria-selected="${this.$tab.value === "overview"}"> 295 + <label @click="${() => this.$tab.value = "overview"}"> 296 + <span>Overview</span> 297 + </label> 298 + </li> 299 + <li role="tab" aria-selected="${this.$tab.value === "https"}"> 300 + <label @click="${() => this.$tab.value = "https"}"> 301 + <span>HTTPS</span> 302 + </label> 303 + </li> 304 + <li role="tab" aria-selected="${this.$tab.value === "opensubsonic"}"> 305 + <label @click="${() => this.$tab.value = "opensubsonic"}"> 306 + <span>OpenSubsonic</span> 307 + </label> 308 + </li> 309 + <li role="tab" aria-selected="${this.$tab.value === "s3"}"> 310 + <label @click="${() => this.$tab.value = "s3"}"> 311 + <span>S3</span> 312 + </label> 313 + </li> 314 + </menu> 315 + 316 + <div class="window" role="tabpanel"> 317 + ${this.#renderTab(html)} 318 + </div> 319 + </div> 320 + `; 321 + } 322 + /** 323 + * @param {RenderArg["html"]} html 324 + */ 325 + #renderTab(html) { 326 + switch (this.$tab.value) { 327 + case "overview": 328 + return this.#renderOverviewTab(html); 329 + case "https": 330 + return this.#renderHttpsTab(html); 331 + case "opensubsonic": 332 + return this.#renderOpenSubsonicTab(html); 333 + case "s3": 334 + return this.#renderS3Tab(html); 335 + default: 336 + return A; 337 + } 338 + } 339 + /** 340 + * @param {RenderArg["html"]} html 341 + */ 342 + #renderOverviewTab(html) { 343 + return html` 344 + <div class="window-body"> 345 + <fieldset> 346 + <span class="with-icon with-icon--large"> 347 + <img 348 + src="images/icons/windows_98/cd_audio_cd_a-0.png" 349 + width="24" 350 + /> 351 + <span>Here you can configure where your audio comes from.<br />Add sources 352 + using the tabs above, then tracks will be processed automatically. 353 + </span> 354 + </span> 355 + </fieldset> 356 + 357 + ${this.#renderProcessingProgress(html)} 358 + </div> 359 + `; 360 + } 361 + /** 362 + * @param {RenderArg["html"]} html 363 + */ 364 + #renderHttpsTab(html) { 365 + const sources = this.$sourcesOrchestrator.value?.sources(); 366 + return html` 367 + <div class="window-body"> 368 + <fieldset> 369 + ${this.#renderList( 370 + html, 371 + sources?.[SCHEME] ?? [], 372 + "Added URLs" 373 + )} 374 + 375 + <p> 376 + <button disabled role="delete" @click="${this.#deleteSelected}"> 377 + Delete selected 378 + </button> 379 + </p> 380 + </fieldset> 381 + 382 + <form @submit="${this.#addHttpsUrl}"> 383 + <fieldset> 384 + <div class="field-row"> 385 + <label for="https-url">URL:</label> 386 + <input 387 + id="https-url" 388 + type="url" 389 + required 390 + placeholder="https://example.com/audio.mp3" 391 + /> 392 + </div> 393 + </fieldset> 394 + 395 + <p> 396 + <button type="submit" id="https-submit">Add URL</button> 397 + </p> 398 + </form> 399 + </div> 400 + `; 401 + } 402 + /** 403 + * @param {RenderArg["html"]} html 404 + */ 405 + #renderOpenSubsonicTab(html) { 406 + const sources = this.$sourcesOrchestrator.value?.sources(); 407 + return html` 408 + <div class="window-body"> 409 + <fieldset> 410 + ${this.#renderList( 411 + html, 412 + sources?.[SCHEME2] ?? [], 413 + "Added servers" 414 + )} 415 + 416 + <p> 417 + <button disabled role="delete" @click="${this.#deleteSelected}"> 418 + Delete selected 419 + </button> 420 + </p> 421 + </fieldset> 422 + 423 + <form @submit="${this.#addOpenSubsonicServer}"> 424 + <fieldset> 425 + <legend>Server details</legend> 426 + 427 + <div class="field-row"> 428 + <label for="opensubsonic-host">Host domain:*</label> 429 + <input id="opensubsonic-host" type="text" required /> 430 + </div> 431 + 432 + <div class="field-row"> 433 + <label for="opensubsonic-tls">Use HTTPS/TLS:</label> 434 + <select id="opensubsonic-tls"> 435 + <option value="true" selected>Yes</option> 436 + <option value="false">No</option> 437 + </select> 438 + </div> 439 + 440 + <p> 441 + Either provide a username & password combination: 442 + </p> 443 + 444 + <div class="field-row"> 445 + <label for="opensubsonic-username">Username:</label> 446 + <input id="opensubsonic-username" type="text" /> 447 + </div> 448 + 449 + <div class="field-row"> 450 + <label for="opensubsonic-password">Password:</label> 451 + <input id="opensubsonic-password" type="password" /> 452 + </div> 453 + 454 + <p> 455 + Or an API key: 456 + </p> 457 + 458 + <div class="field-row"> 459 + <label for="opensubsonic-apikey">API key:</label> 460 + <input id="opensubsonic-apikey" type="text" /> 461 + </div> 462 + 463 + <p> 464 + * are required fields. 465 + </p> 466 + </fieldset> 467 + 468 + <p> 469 + <button type="submit" id="opensubsonic-submit">Add server</button> 470 + </p> 471 + </form> 472 + </div> 473 + `; 474 + } 475 + /** 476 + * @param {RenderArg["html"]} html 477 + */ 478 + #renderS3Tab(html) { 479 + const sources = this.$sourcesOrchestrator.value?.sources(); 480 + return html` 481 + <div class="window-body"> 482 + <fieldset> 483 + ${this.#renderList( 484 + html, 485 + sources?.[SCHEME3] ?? [], 486 + "Added buckets" 487 + )} 488 + 489 + <p> 490 + <button disabled role="delete" @click="${this.#deleteSelected}"> 491 + Delete selected 492 + </button> 493 + </p> 494 + </fieldset> 495 + 496 + <form @submit="${this.#addS3Bucket}"> 497 + <fieldset> 498 + <legend>Bucket details</legend> 499 + 500 + <div class="field-row"> 501 + <label for="s3-access-key">Access Key:*</label> 502 + <input type="text" id="s3-access-key" required /> 503 + </div> 504 + 505 + <div class="field-row"> 506 + <label for="s3-secret-key">Secret Key:*</label> 507 + <input type="password" id="s3-secret-key" required /> 508 + </div> 509 + 510 + <div class="field-row"> 511 + <label for="s3-bucket-name">Bucket Name:*</label> 512 + <input type="text" id="s3-bucket-name" required /> 513 + </div> 514 + 515 + <div class="field-row"> 516 + <label for="s3-host">Host:</label> 517 + <input 518 + type="text" 519 + id="s3-host" 520 + placeholder="s3.amazonaws.com" 521 + /> 522 + </div> 523 + 524 + <div class="field-row"> 525 + <label for="s3-region">Region:</label> 526 + <input 527 + type="text" 528 + id="s3-region" 529 + placeholder="us-east-1" 530 + /> 531 + </div> 532 + 533 + <div class="field-row"> 534 + <label for="s3-path">Path:</label> 535 + <input type="text" id="s3-path" /> 536 + </div> 537 + 538 + <p> 539 + * are required fields. 540 + </p> 541 + </fieldset> 542 + 543 + <p> 544 + <button type="submit" id="s3-submit">Add bucket</button> 545 + </p> 546 + </form> 547 + </div> 548 + `; 549 + } 550 + /** 551 + * @param {RenderArg["html"]} html 552 + */ 553 + #renderProcessingProgress(html) { 554 + const orchestrator = this.$processTracksOrchestrator.value; 555 + if (!orchestrator?.isProcessing()) return A; 556 + const { processed, total } = orchestrator.progress(); 557 + const percentage = total > 0 ? Math.round(processed / total * 100) : 0; 558 + return html` 559 + <fieldset> 560 + <legend>Processing tracks</legend> 561 + <div class="with-icon with-icon--large"> 562 + <img 563 + src="images/icons/windows_98/gears-0.png" 564 + width="24" 565 + /> 566 + <span> 567 + ${total === 0 ? `Going through all the inputs and gathering the tracks ...` : `Making sure each track has metadata & statistics (${processed} / ${total}) ...`} 568 + </span> 569 + </div> 570 + <div 571 + class="progress-indicator" 572 + style="margin-top: var(--grouped-element-spacing);" 573 + > 574 + <div class="progress-indicator-bar" style="width: ${percentage}%"></div> 575 + </div> 576 + </fieldset> 577 + `; 578 + } 579 + /** 580 + * @param {RenderArg["html"]} html 581 + * @param {Array<{label: string, uri: string}>} list 582 + * @param {string} title 583 + */ 584 + #renderList(html, list, title) { 585 + return html` 586 + <div class="sunken-panel"> 587 + <table style="width: 100%;" @click="${this.#highlightTableEntry}"> 588 + <thead> 589 + <tr> 590 + <th>${title}</th> 591 + </tr> 592 + </thead> 593 + <tbody> 594 + ${list.map( 595 + (item) => html` 596 + <tr data-uri="${item.uri}"> 597 + <td>${item.label}</td> 598 + </tr> 599 + ` 600 + )} 601 + </tbody> 602 + </table> 603 + </div> 604 + `; 605 + } 606 + }; 607 + var element_default = InputConfig; 608 + var CLASS = InputConfig; 609 + var NAME = "dtw-input-config"; 610 + customElements.define(NAME, CLASS); 611 + 612 + export { 613 + element_default, 614 + CLASS, 615 + NAME 616 + }; 617 + 618 + //# sourceMappingURL=./chunk-4KKQSTV5.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4KKQSTV5.js.map
··· 1 + {"version":3,"sources":["/themes/webamp/configurators/input/element.js"],"sourcesContent":["import {\n DiffuseElement,\n nothing,\n query,\n queryOptional,\n} from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\nimport { buildURI as buildOpenSubsonicURI } from \"@components/input/opensubsonic/common.js\";\nimport { buildURI as buildS3cURI } from \"@components/input/s3/common.js\";\n\nimport { SCHEME as HTTPS_SCHEME } from \"@components/input/https/constants.js\";\nimport { SCHEME as OPENSUBSONIC_SCHEME } from \"@components/input/opensubsonic/constants.js\";\nimport { SCHEME as S3_SCHEME } from \"@components/input/s3/constants.js\";\n\nimport { highlightTableEntry } from \"../../common/ui.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n * @import {InputElement} from \"@components/input/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n *\n * @import {Server as OpenSubsonicServer} from \"@components/input/opensubsonic/types.d.ts\"\n * @import {Bucket as S3Bucket} from \"@components/input/s3/types.d.ts\"\n */\n\nclass InputConfig extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n // SIGNALS\n\n $input = signal(\n /** @type {InputElement | undefined} */ (undefined),\n );\n\n $output = signal(\n /** @type {OutputElement | undefined} */ (undefined),\n );\n\n $sourcesOrchestrator = signal(\n /** @type {import(\"@components/orchestrator/sources/element.js\").CLASS | undefined} */ (undefined),\n );\n\n $processTracksOrchestrator = signal(\n /** @type {import(\"@components/orchestrator/process-tracks/element.js\").CLASS | undefined} */ (undefined),\n );\n\n $tab = signal(\"overview\");\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\n\n /** @type {InputElement} */\n const input = query(this, \"input-selector\");\n\n /** @type {OutputElement} */\n const output = query(this, \"output-selector\");\n\n /** @type {import(\"@components/orchestrator/sources/element.js\").CLASS} */\n const sourcesOrchestrator = query(this, \"sources-orchestrator-selector\");\n\n /** @type {import(\"@components/orchestrator/process-tracks/element.js\").CLASS | null} */\n const processTracksOrchestrator = queryOptional(\n this,\n \"process-tracks-orchestrator-selector\",\n );\n\n await customElements.whenDefined(input.localName);\n await customElements.whenDefined(output.localName);\n await customElements.whenDefined(sourcesOrchestrator.localName);\n\n if (processTracksOrchestrator) {\n await customElements.whenDefined(processTracksOrchestrator.localName);\n }\n\n this.$input.value = input;\n this.$output.value = output;\n this.$sourcesOrchestrator.value = sourcesOrchestrator;\n\n if (processTracksOrchestrator) {\n this.$processTracksOrchestrator.value = processTracksOrchestrator;\n }\n }\n\n // EVENTS\n\n /**\n * @param {Event} event\n */\n #addOpenSubsonicServer = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#opensubsonic-submit\");\n if (button) button.disabled = true;\n\n const host = this.formElement(\"opensubsonic-host\")?.value;\n const tls = this.formElement(\"opensubsonic-tls\")?.value === \"true\";\n const username = this.formElement(\"opensubsonic-username\")?.value;\n const password = this.formElement(\"opensubsonic-password\")?.value;\n const apiKey = this.formElement(\"opensubsonic-apikey\")?.value;\n\n if (!host) {\n throw new Error(\"Missing required `host` input value\");\n }\n\n /** @type {OpenSubsonicServer} */\n const server = {\n host,\n tls,\n username,\n password,\n apiKey,\n };\n\n const uri = buildOpenSubsonicURI(server);\n await this.addSource(uri);\n\n if (button) button.disabled = false;\n };\n\n /**\n * @param {Event} event\n */\n #addS3Bucket = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"s3-submit\");\n if (button) button.disabled = true;\n\n const accessKey = this.formElement(\"s3-access-key\")?.value;\n const bucketName = this.formElement(\"s3-bucket-name\")?.value;\n const host = this.formElement(\"s3-host\")?.value;\n const path = this.formElement(\"s3-path\")?.value;\n const region = this.formElement(\"s3-region\")?.value;\n const secretKey = this.formElement(\"s3-secret-key\")?.value;\n\n if (!accessKey) {\n throw new Error(\"Missing required `accessKey` input value\");\n }\n if (!bucketName) {\n throw new Error(\"Missing required `bucketName` input value\");\n }\n if (!secretKey) {\n throw new Error(\"Missing required `secretKey` input value\");\n }\n\n /** @type {S3Bucket} */\n const bucket = {\n accessKey,\n bucketName,\n host: host?.length ? host : \"s3.amazonaws.com\",\n path: path?.length ? path : \"/\",\n region: region?.length ? region : \"us-east-1\",\n secretKey,\n };\n\n const uri = buildS3cURI(bucket);\n await this.addSource(uri);\n\n if (button) button.disabled = false;\n };\n\n /**\n * @param {Event} event\n */\n #addHttpsUrl = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#https-submit\");\n if (button) button.disabled = true;\n\n const url = this.formElement(\"https-url\")?.value;\n\n if (!url) {\n throw new Error(\"Missing required `url` input value\");\n }\n\n await this.addSource(url);\n\n if (button) button.disabled = false;\n };\n\n /**\n * @param {Event} event\n */\n #deleteSelected = async (event) => {\n const button = /** @type {HTMLElement} */ (event.target);\n const fieldset = event.target ? button.closest(\"fieldset\") : null;\n if (!fieldset) return;\n\n const selected = fieldset.querySelector(\n \"table tr.highlighted\",\n );\n if (!selected) return;\n\n const uri = selected.getAttribute(\"data-uri\");\n if (!uri) throw new Error(\"Missing `uri` attribute\");\n\n const detachedTracks = await this.$input.value?.detach({\n fileUriOrScheme: uri,\n tracks: this.$output.value?.tracks.collection() ?? [],\n });\n\n if (detachedTracks) this.$output.value?.tracks.save(detachedTracks);\n };\n\n /** @param {MouseEvent} event */\n #highlightTableEntry(event) {\n highlightTableEntry(event);\n\n const fieldset = event.target\n ? /** @type {HTMLElement} */ (event.target).closest(\"fieldset\")\n : null;\n if (!fieldset) return;\n\n fieldset.querySelector('button[role=\"delete\"]')?.removeAttribute(\n \"disabled\",\n );\n }\n\n // 🛠️\n\n /**\n * @param {string} uri\n */\n async addSource(uri) {\n /** @type {Track} */\n const track = {\n $type: \"sh.diffuse.output.track\",\n id: crypto.randomUUID(),\n kind: \"placeholder\",\n uri,\n };\n\n await this.$output.value?.tracks.save(\n [...(this.$output.value?.tracks.collection() ?? []), track],\n );\n\n this.$tab.value = \"overview\";\n }\n\n /**\n * @param {string} id\n * @returns {HTMLInputElement | null}\n */\n formElement(id) {\n return this.root().querySelector(`#${id}`);\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <link rel=\"stylesheet\" href=\"styles/vendor/98.css\" />\n <link rel=\"stylesheet\" href=\"themes/webamp/98-extra.css\" />\n\n <style>\n @import \"./themes/webamp/98-vars.css\";\n\n #tabbed {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n fieldset {\n margin-bottom: var(--element-spacing);\n }\n\n .window {\n flex: 1;\n overflow-y: auto;\n }\n\n /* TABS */\n\n menu[role=\"tablist\"] {\n padding-top: 2px;\n\n li > label {\n cursor: pointer;\n display: block;\n padding: var(--radio-label-spacing);\n }\n\n li[aria-selected=\"true\"] {\n padding-bottom: 2px;\n margin-top: -2px;\n background-color: var(--surface);\n position: relative;\n z-index: 8;\n margin-left: -3px;\n }\n }\n\n /* LIST */\n\n table {\n color: black;\n table-layout: fixed;\n }\n\n table td {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n table tbody tr {\n cursor: pointer;\n }\n\n /* FORMS */\n\n input, select, textarea {\n flex: 1;\n }\n </style>\n\n <div id=\"tabbed\">\n <menu role=\"tablist\" class=\"multirows\">\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"overview\"}\">\n <label @click=\"${() => this.$tab.value = \"overview\"}\">\n <span>Overview</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"https\"}\">\n <label @click=\"${() => this.$tab.value = \"https\"}\">\n <span>HTTPS</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"opensubsonic\"}\">\n <label @click=\"${() => this.$tab.value = \"opensubsonic\"}\">\n <span>OpenSubsonic</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"s3\"}\">\n <label @click=\"${() => this.$tab.value = \"s3\"}\">\n <span>S3</span>\n </label>\n </li>\n </menu>\n\n <div class=\"window\" role=\"tabpanel\">\n ${this.#renderTab(html)}\n </div>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderTab(html) {\n switch (this.$tab.value) {\n case \"overview\":\n return this.#renderOverviewTab(html);\n case \"https\":\n return this.#renderHttpsTab(html);\n case \"opensubsonic\":\n return this.#renderOpenSubsonicTab(html);\n case \"s3\":\n return this.#renderS3Tab(html);\n default:\n return nothing;\n }\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderOverviewTab(html) {\n return html`\n <div class=\"window-body\">\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/cd_audio_cd_a-0.png\"\n width=\"24\"\n />\n <span>Here you can configure where your audio comes from.<br />Add sources\n using the tabs above, then tracks will be processed automatically.\n </span>\n </span>\n </fieldset>\n\n ${this.#renderProcessingProgress(html)}\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderHttpsTab(html) {\n const sources = this.$sourcesOrchestrator.value?.sources();\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n ${this.#renderList(\n html,\n sources?.[HTTPS_SCHEME] ?? [],\n \"Added URLs\",\n )}\n\n <p>\n <button disabled role=\"delete\" @click=\"${this.#deleteSelected}\">\n Delete selected\n </button>\n </p>\n </fieldset>\n\n <form @submit=\"${this.#addHttpsUrl}\">\n <fieldset>\n <div class=\"field-row\">\n <label for=\"https-url\">URL:</label>\n <input\n id=\"https-url\"\n type=\"url\"\n required\n placeholder=\"https://example.com/audio.mp3\"\n />\n </div>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"https-submit\">Add URL</button>\n </p>\n </form>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderOpenSubsonicTab(html) {\n const sources = this.$sourcesOrchestrator.value?.sources();\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n ${this.#renderList(\n html,\n sources?.[OPENSUBSONIC_SCHEME] ?? [],\n \"Added servers\",\n )}\n\n <p>\n <button disabled role=\"delete\" @click=\"${this.#deleteSelected}\">\n Delete selected\n </button>\n </p>\n </fieldset>\n\n <form @submit=\"${this.#addOpenSubsonicServer}\">\n <fieldset>\n <legend>Server details</legend>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-host\">Host domain:*</label>\n <input id=\"opensubsonic-host\" type=\"text\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-tls\">Use HTTPS/TLS:</label>\n <select id=\"opensubsonic-tls\">\n <option value=\"true\" selected>Yes</option>\n <option value=\"false\">No</option>\n </select>\n </div>\n\n <p>\n Either provide a username & password combination:\n </p>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-username\">Username:</label>\n <input id=\"opensubsonic-username\" type=\"text\" />\n </div>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-password\">Password:</label>\n <input id=\"opensubsonic-password\" type=\"password\" />\n </div>\n\n <p>\n Or an API key:\n </p>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-apikey\">API key:</label>\n <input id=\"opensubsonic-apikey\" type=\"text\" />\n </div>\n\n <p>\n * are required fields.\n </p>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"opensubsonic-submit\">Add server</button>\n </p>\n </form>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderS3Tab(html) {\n const sources = this.$sourcesOrchestrator.value?.sources();\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n ${this.#renderList(\n html,\n sources?.[S3_SCHEME] ?? [],\n \"Added buckets\",\n )}\n\n <p>\n <button disabled role=\"delete\" @click=\"${this.#deleteSelected}\">\n Delete selected\n </button>\n </p>\n </fieldset>\n\n <form @submit=\"${this.#addS3Bucket}\">\n <fieldset>\n <legend>Bucket details</legend>\n\n <div class=\"field-row\">\n <label for=\"s3-access-key\">Access Key:*</label>\n <input type=\"text\" id=\"s3-access-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-secret-key\">Secret Key:*</label>\n <input type=\"password\" id=\"s3-secret-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-bucket-name\">Bucket Name:*</label>\n <input type=\"text\" id=\"s3-bucket-name\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-host\">Host:</label>\n <input\n type=\"text\"\n id=\"s3-host\"\n placeholder=\"s3.amazonaws.com\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-region\">Region:</label>\n <input\n type=\"text\"\n id=\"s3-region\"\n placeholder=\"us-east-1\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-path\">Path:</label>\n <input type=\"text\" id=\"s3-path\" />\n </div>\n\n <p>\n * are required fields.\n </p>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"s3-submit\">Add bucket</button>\n </p>\n </form>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderProcessingProgress(html) {\n const orchestrator = this.$processTracksOrchestrator.value;\n if (!orchestrator?.isProcessing()) return nothing;\n\n const { processed, total } = orchestrator.progress();\n const percentage = total > 0 ? Math.round((processed / total) * 100) : 0;\n\n return html`\n <fieldset>\n <legend>Processing tracks</legend>\n <div class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/gears-0.png\"\n width=\"24\"\n />\n <span>\n ${total === 0\n ? `Going through all the inputs and gathering the tracks ...`\n : `Making sure each track has metadata & statistics (${processed} / ${total}) ...`}\n </span>\n </div>\n <div\n class=\"progress-indicator\"\n style=\"margin-top: var(--grouped-element-spacing);\"\n >\n <div class=\"progress-indicator-bar\" style=\"width: ${percentage}%\"></div>\n </div>\n </fieldset>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n * @param {Array<{label: string, uri: string}>} list\n * @param {string} title\n */\n #renderList(html, list, title) {\n return html`\n <div class=\"sunken-panel\">\n <table style=\"width: 100%;\" @click=\"${this.#highlightTableEntry}\">\n <thead>\n <tr>\n <th>${title}</th>\n </tr>\n </thead>\n <tbody>\n ${list.map((item) =>\n html`\n <tr data-uri=\"${item.uri}\">\n <td>${item.label}</td>\n </tr>\n `\n )}\n </tbody>\n </table>\n </div>\n `;\n }\n}\n\nexport default InputConfig;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = InputConfig;\nexport const NAME = \"dtw-input-config\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":["buildURI","SCHEME"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-4KKQSTV5.js.map"}
+135
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4MLZJ4ZD.js
··· 1 + import { 2 + BroadcastableDiffuseElement, 3 + query 4 + } from "./chunk-H46AZIKM.js"; 5 + import { 6 + signal, 7 + untracked 8 + } from "./chunk-IZOBPV2S.js"; 9 + import { 10 + listen 11 + } from "./chunk-EJ2QF5QE.js"; 12 + import { 13 + __name, 14 + init_Buffer, 15 + init_process 16 + } from "./chunk-FZQXS3RE.js"; 17 + 18 + // components/orchestrator/process-tracks/element.js 19 + init_Buffer(); 20 + init_process(); 21 + var ProcessTracksOrchestrator = class extends BroadcastableDiffuseElement { 22 + static { 23 + __name(this, "ProcessTracksOrchestrator"); 24 + } 25 + static NAME = "diffuse/orchestrator/process-tracks"; 26 + static WORKER_URL = "components/orchestrator/process-tracks/worker.js"; 27 + /** @type {ProxiedActions<Actions>} */ 28 + #proxy; 29 + constructor() { 30 + super(); 31 + this.#proxy = this.workerProxy({ 32 + forceNew: { 33 + dependencies: { input: true } 34 + } 35 + }); 36 + } 37 + // SIGNALS 38 + #isProcessing = signal(false); 39 + #performedInitialProcess = signal(false); 40 + #progress = signal( 41 + /** @type {Progress} */ 42 + { processed: 0, total: 0 } 43 + ); 44 + // STATE 45 + isProcessing = this.#isProcessing.get; 46 + progress = this.#progress.get; 47 + // LIFECYCLE 48 + /** 49 + * @override 50 + */ 51 + async connectedCallback() { 52 + if (this.hasAttribute("group")) { 53 + const actions = this.broadcast(this.nameWithGroup, { 54 + perfInit: { 55 + strategy: "replicate", 56 + fn: this.#performedInitialProcess.set 57 + }, 58 + process: { strategy: "leaderOnly", fn: this.process } 59 + }); 60 + if (actions) { 61 + this.process = actions.process; 62 + this.#isProcessing.set = actions.perfInit; 63 + } 64 + } 65 + super.connectedCallback(); 66 + const input = query(this, "input-selector"); 67 + const output = query(this, "output-selector"); 68 + const metadataProcessor = query(this, "metadata-processor-selector"); 69 + this.input = input; 70 + this.output = output; 71 + this.metadataProcessor = metadataProcessor; 72 + await customElements.whenDefined(input.localName); 73 + await customElements.whenDefined(output.localName); 74 + await customElements.whenDefined(metadataProcessor.localName); 75 + const link = this.workerLink(); 76 + listen("progress", this.#progress.set, link); 77 + this.#proxy.progress().then(this.#progress.set); 78 + if (this.hasAttribute("process-when-ready")) { 79 + const unregister = this.effect(() => { 80 + const state = output.tracks.state(); 81 + if (state !== "loaded") return; 82 + if (this.#performedInitialProcess.value) { 83 + unregister(); 84 + return; 85 + } 86 + this.#performedInitialProcess.set(true); 87 + const skip = ( 88 + /** @type {any} */ 89 + import.meta.env?.DISABLE_AUTOMATIC_TRACKS_PROCESSING ?? false 90 + ); 91 + if (skip) return; 92 + untracked(() => this.process()); 93 + unregister(); 94 + }); 95 + } 96 + } 97 + // WORKERS 98 + /** 99 + * @override 100 + */ 101 + dependencies() { 102 + if (!this.input) throw new Error("Input element not defined yet"); 103 + if (!this.metadataProcessor) { 104 + throw new Error("Metadata processor element not defined yet"); 105 + } 106 + return { 107 + input: this.input, 108 + metadataProcessor: this.metadataProcessor 109 + }; 110 + } 111 + // ACTIONS 112 + async process() { 113 + if (!this.output) return; 114 + if (this.#isProcessing.value) return; 115 + this.#isProcessing.value = true; 116 + console.log("\u{1FAB5} Processing initiated"); 117 + const cachedTracks = this.output.tracks.collection(); 118 + const result = await this.#proxy.process(cachedTracks); 119 + if (result) await this.output.tracks.save(result); 120 + console.log("\u{1FAB5} Processing completed"); 121 + this.#isProcessing.value = false; 122 + } 123 + }; 124 + var element_default = ProcessTracksOrchestrator; 125 + var CLASS = ProcessTracksOrchestrator; 126 + var NAME = "do-process-tracks"; 127 + customElements.define(NAME, ProcessTracksOrchestrator); 128 + 129 + export { 130 + element_default, 131 + CLASS, 132 + NAME 133 + }; 134 + 135 + //# sourceMappingURL=./chunk-4MLZJ4ZD.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4MLZJ4ZD.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/process-tracks/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement, query } from \"@common/element.js\";\nimport { signal, untracked } from \"@common/signal.js\";\nimport { listen } from \"@common/worker.js\";\n\n/**\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {InputElement} from \"@components/input/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n *\n * @import {Actions, Progress} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * Processes inputs into tracks whenever\n * the already existing tracks are loaded\n * from the assigned output element.\n */\nclass ProcessTracksOrchestrator extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/orchestrator/process-tracks\";\n static WORKER_URL = \"components/orchestrator/process-tracks/worker.js\";\n\n /** @type {ProxiedActions<Actions>} */\n #proxy;\n\n constructor() {\n super();\n this.#proxy = this.workerProxy({\n forceNew: {\n dependencies: { input: true },\n },\n });\n }\n\n // SIGNALS\n\n #isProcessing = signal(false);\n #performedInitialProcess = signal(false);\n #progress = signal(/** @type {Progress} */ ({ processed: 0, total: 0 }));\n\n // STATE\n\n isProcessing = this.#isProcessing.get;\n progress = this.#progress.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n perfInit: {\n strategy: \"replicate\",\n fn: this.#performedInitialProcess.set,\n },\n process: { strategy: \"leaderOnly\", fn: this.process },\n });\n\n if (actions) {\n this.process = actions.process;\n this.#isProcessing.set = actions.perfInit;\n }\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {InputElement} */\n const input = query(this, \"input-selector\");\n\n /** @type {OutputElement} */\n const output = query(this, \"output-selector\");\n\n /** @type {import(\"@components/processor/metadata/element.js\").CLASS} */\n const metadataProcessor = query(this, \"metadata-processor-selector\");\n\n // Assign to self\n this.input = input;\n this.output = output;\n this.metadataProcessor = metadataProcessor;\n\n // Wait until defined\n await customElements.whenDefined(input.localName);\n await customElements.whenDefined(output.localName);\n await customElements.whenDefined(metadataProcessor.localName);\n\n // Sync progress with worker\n const link = this.workerLink();\n listen(\"progress\", this.#progress.set, link);\n this.#proxy.progress().then(this.#progress.set);\n\n // Process whenever tracks are initially loaded;\n // unless already done so (possibly through another instance of this element)\n if (this.hasAttribute(\"process-when-ready\")) {\n const unregister = this.effect(() => {\n const state = output.tracks.state();\n if (state !== \"loaded\") return;\n\n if (this.#performedInitialProcess.value) {\n unregister();\n return;\n }\n\n this.#performedInitialProcess.set(true);\n\n const skip = /** @type {any} */ (import.meta).env\n ?.DISABLE_AUTOMATIC_TRACKS_PROCESSING ?? false;\n if (skip) return;\n\n untracked(() => this.process());\n unregister();\n });\n }\n }\n\n // WORKERS\n\n /**\n * @override\n */\n dependencies() {\n if (!this.input) throw new Error(\"Input element not defined yet\");\n if (!this.metadataProcessor) {\n throw new Error(\"Metadata processor element not defined yet\");\n }\n\n return {\n input: this.input,\n metadataProcessor: this.metadataProcessor,\n };\n }\n\n // ACTIONS\n\n async process() {\n if (!this.output) return;\n if (this.#isProcessing.value) return;\n\n // Start\n this.#isProcessing.value = true;\n console.log(\"🪵 Processing initiated\");\n\n const cachedTracks = this.output.tracks.collection();\n const result = await this.#proxy.process(cachedTracks);\n\n // Save if collection changed\n if (result) await this.output.tracks.save(result);\n\n // Fin\n console.log(\"🪵 Processing completed\");\n this.#isProcessing.value = false;\n }\n}\n\nexport default ProcessTracksOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ProcessTracksOrchestrator;\nexport const NAME = \"do-process-tracks\";\n\ncustomElements.define(NAME, ProcessTracksOrchestrator);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-4MLZJ4ZD.js.map"}
+36
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4XYXC3TC.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + __name, 6 + init_Buffer, 7 + init_process 8 + } from "./chunk-FZQXS3RE.js"; 9 + 10 + // components/processor/metadata/element.js 11 + init_Buffer(); 12 + init_process(); 13 + var MetadataProcessor = class extends DiffuseElement { 14 + static { 15 + __name(this, "MetadataProcessor"); 16 + } 17 + static NAME = "diffuse/processor/metadata"; 18 + static WORKER_URL = "components/processor/metadata/worker.js"; 19 + constructor() { 20 + super(); 21 + const p = this.workerProxy(); 22 + this.supply = p.supply; 23 + } 24 + }; 25 + var element_default = MetadataProcessor; 26 + var CLASS = MetadataProcessor; 27 + var NAME = "dp-metadata"; 28 + customElements.define(NAME, MetadataProcessor); 29 + 30 + export { 31 + element_default, 32 + CLASS, 33 + NAME 34 + }; 35 + 36 + //# sourceMappingURL=./chunk-4XYXC3TC.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4XYXC3TC.js.map
··· 1 + {"version":3,"sources":["/components/processor/metadata/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\n\n/**\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {Actions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<Actions>}\n */\nclass MetadataProcessor extends DiffuseElement {\n static NAME = \"diffuse/processor/metadata\";\n static WORKER_URL = \"components/processor/metadata/worker.js\";\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<Actions>} */\n const p = this.workerProxy();\n\n // Worker proxy\n this.supply = p.supply;\n }\n}\n\nexport default MetadataProcessor;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = MetadataProcessor;\nexport const NAME = \"dp-metadata\";\n\ncustomElements.define(NAME, MetadataProcessor);\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAcA,IAAM,oBAAN,cAAgC,eAAe;AAAA,EAd/C,OAc+C;AAAA;AAAA;AAAA,EAC7C,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,cAAc;AACZ,UAAM;AAGN,UAAM,IAAI,KAAK,YAAY;AAG3B,SAAK,SAAS,EAAE;AAAA,EAClB;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,iBAAiB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-4XYXC3TC.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4YB6QUPN.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-4YB6QUPN.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-5UTOUDDD.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-5UTOUDDD.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-5UTOUDDD.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-5UTOUDDD.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-6DRHTH2U.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-6DRHTH2U.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js.map
+73
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-6YF7B6KW.js
··· 1 + import { 2 + OutputTransformer 3 + } from "./chunk-3G4WUGDN.js"; 4 + import { 5 + computed 6 + } from "./chunk-IZOBPV2S.js"; 7 + import { 8 + __name, 9 + init_Buffer, 10 + init_process 11 + } from "./chunk-FZQXS3RE.js"; 12 + 13 + // components/transformer/output/refiner/default/element.js 14 + init_Buffer(); 15 + init_process(); 16 + var DefaultOutputRefinerTransformer = class extends OutputTransformer { 17 + static { 18 + __name(this, "DefaultOutputRefinerTransformer"); 19 + } 20 + constructor() { 21 + super(); 22 + const base = this.base(); 23 + const manager = { 24 + facets: { 25 + ...base.facets, 26 + collection: computed(() => { 27 + return base.facets.collection() ?? []; 28 + }) 29 + }, 30 + playlists: { 31 + ...base.playlists, 32 + collection: computed(() => { 33 + return base.playlists.collection() ?? []; 34 + }) 35 + }, 36 + themes: { 37 + ...base.themes, 38 + collection: computed(() => { 39 + return base.themes.collection() ?? []; 40 + }) 41 + }, 42 + tracks: { 43 + ...base.tracks, 44 + collection: computed(() => { 45 + return base.tracks.collection() ?? []; 46 + }), 47 + save: /* @__PURE__ */ __name(async (newTracks) => { 48 + const filtered = newTracks.filter((t) => !t.ephemeral); 49 + await base.tracks.save(filtered); 50 + }, "save") 51 + }, 52 + // Other 53 + ready: base.ready 54 + }; 55 + this.facets = manager.facets; 56 + this.playlists = manager.playlists; 57 + this.themes = manager.themes; 58 + this.tracks = manager.tracks; 59 + this.ready = manager.ready; 60 + } 61 + }; 62 + var element_default = DefaultOutputRefinerTransformer; 63 + var CLASS = DefaultOutputRefinerTransformer; 64 + var NAME = "dtor-default"; 65 + customElements.define(NAME, CLASS); 66 + 67 + export { 68 + element_default, 69 + CLASS, 70 + NAME 71 + }; 72 + 73 + //# sourceMappingURL=./chunk-6YF7B6KW.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-6YF7B6KW.js.map
··· 1 + {"version":3,"sources":["/components/transformer/output/refiner/default/element.js"],"sourcesContent":["import { computed } from \"@common/signal.js\";\nimport { OutputTransformer } from \"../../base.js\";\n\n/**\n * @import { OutputManagerDeputy } from \"../../../../output/types.d.ts\"\n */\n\n/**\n * @extends {OutputTransformer}\n */\nclass DefaultOutputRefinerTransformer extends OutputTransformer {\n constructor() {\n super();\n\n const base = this.base();\n\n /** @type {OutputManagerDeputy} */\n const manager = {\n facets: {\n ...base.facets,\n collection: computed(() => {\n return base.facets.collection() ?? [];\n }),\n },\n playlists: {\n ...base.playlists,\n collection: computed(() => {\n return base.playlists.collection() ?? [];\n }),\n },\n themes: {\n ...base.themes,\n collection: computed(() => {\n return base.themes.collection() ?? [];\n }),\n },\n tracks: {\n ...base.tracks,\n collection: computed(() => {\n return base.tracks.collection() ?? [];\n }),\n save: async (newTracks) => {\n const filtered = newTracks.filter((t) => !t.ephemeral);\n await base.tracks.save(filtered);\n },\n },\n\n // Other\n ready: base.ready,\n };\n\n // Assign manager properties to class\n this.facets = manager.facets;\n this.playlists = manager.playlists;\n this.themes = manager.themes;\n this.tracks = manager.tracks;\n this.ready = manager.ready;\n }\n}\n\nexport default DefaultOutputRefinerTransformer;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = DefaultOutputRefinerTransformer;\nexport const NAME = \"dtor-default\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAUA,IAAM,kCAAN,cAA8C,kBAAkB;AAAA,EAVhE,OAUgE;AAAA;AAAA;AAAA,EAC9D,cAAc;AACZ,UAAM;AAEN,UAAM,OAAO,KAAK,KAAK;AAGvB,UAAM,UAAU;AAAA,MACd,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,iBAAO,KAAK,OAAO,WAAW,KAAK,CAAC;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,MACA,WAAW;AAAA,QACT,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,iBAAO,KAAK,UAAU,WAAW,KAAK,CAAC;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,iBAAO,KAAK,OAAO,WAAW,KAAK,CAAC;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,iBAAO,KAAK,OAAO,WAAW,KAAK,CAAC;AAAA,QACtC,CAAC;AAAA,QACD,MAAM,8BAAO,cAAc;AACzB,gBAAM,WAAW,UAAU,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS;AACrD,gBAAM,KAAK,OAAO,KAAK,QAAQ;AAAA,QACjC,GAHM;AAAA,MAIR;AAAA;AAAA,MAGA,OAAO,KAAK;AAAA,IACd;AAGA,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ;AACzB,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ;AACtB,SAAK,QAAQ,QAAQ;AAAA,EACvB;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-6YF7B6KW.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-77ZY4GQV.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-77ZY4GQV.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AGNDISJF.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-AGNDISJF.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AGNDISJF.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-AGNDISJF.js.map
+1554
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AISBWLUT.js
··· 1 + import { 2 + get, 3 + set 4 + } from "./chunk-JBHW662S.js"; 5 + import { 6 + ENCODINGS, 7 + IDB_BUCKETS, 8 + SCHEME 9 + } from "./chunk-GX3WPNEX.js"; 10 + import { 11 + require_uri_all 12 + } from "./chunk-EEVL24MR.js"; 13 + import { 14 + query_string_default 15 + } from "./chunk-G56PUJUJ.js"; 16 + import { 17 + __name, 18 + __toESM, 19 + init_Buffer, 20 + init_process 21 + } from "./chunk-FZQXS3RE.js"; 22 + 23 + // components/input/s3/common.js 24 + init_Buffer(); 25 + init_process(); 26 + 27 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/mod.ts 28 + init_Buffer(); 29 + init_process(); 30 + 31 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/client.ts 32 + init_Buffer(); 33 + init_process(); 34 + 35 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/transform-chunk-sizes.ts 36 + init_Buffer(); 37 + init_process(); 38 + var TransformChunkSizes = class extends TransformStream { 39 + static { 40 + __name(this, "TransformChunkSizes"); 41 + } 42 + outChunkSize; 43 + constructor(outChunkSize) { 44 + let buffer = new Uint8Array(outChunkSize); 45 + let offset = 0; 46 + super({ 47 + transform(chunk, controller) { 48 + let pos = 0; 49 + while (pos < chunk.length) { 50 + const needed = outChunkSize - offset; 51 + const toCopy = Math.min(needed, chunk.length - pos); 52 + buffer.set(chunk.subarray(pos, pos + toCopy), offset); 53 + pos += toCopy; 54 + offset += toCopy; 55 + if (offset === outChunkSize) { 56 + controller.enqueue(buffer); 57 + buffer = new Uint8Array(outChunkSize); 58 + offset = 0; 59 + } 60 + } 61 + }, 62 + flush(controller) { 63 + if (offset > 0) { 64 + controller.enqueue(buffer.subarray(0, offset)); 65 + } 66 + } 67 + }), this.outChunkSize = outChunkSize; 68 + } 69 + }; 70 + 71 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/errors.ts 72 + init_Buffer(); 73 + init_process(); 74 + 75 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/xml-parser.ts 76 + init_Buffer(); 77 + init_process(); 78 + function parse(xml) { 79 + xml = xml.trim(); 80 + xml = xml.replace(/<!--[\s\S]*?-->/g, ""); 81 + return document(); 82 + function document() { 83 + return { 84 + declaration: declaration(), 85 + root: tag() 86 + }; 87 + } 88 + __name(document, "document"); 89 + function declaration() { 90 + const m = match(/^<\?xml\s*/); 91 + if (!m) return; 92 + const node = { 93 + attributes: {} 94 + }; 95 + while (!(eos() || is("?>"))) { 96 + const attr = attribute(); 97 + if (!attr) return node; 98 + node.attributes[attr.name] = attr.value; 99 + } 100 + match(/\?>\s*/); 101 + return node; 102 + } 103 + __name(declaration, "declaration"); 104 + function tag() { 105 + const m = match(/^<([\w-:.]+)\s*/); 106 + if (!m) return; 107 + const node = { 108 + name: m[1], 109 + attributes: {}, 110 + children: [] 111 + }; 112 + while (!(eos() || is(">") || is("?>") || is("/>"))) { 113 + const attr = attribute(); 114 + if (!attr) return node; 115 + node.attributes[attr.name] = attr.value; 116 + } 117 + if (match(/^\s*\/>\s*/)) { 118 + return node; 119 + } 120 + match(/\??>\s*/); 121 + node.content = content(); 122 + let child; 123 + while (child = tag()) { 124 + node.children.push(child); 125 + } 126 + match(/^<\/[\w-:.]+>\s*/); 127 + return node; 128 + } 129 + __name(tag, "tag"); 130 + function content() { 131 + const m = match(/^([^<]*)/); 132 + if (m) return entities(m[1]); 133 + return ""; 134 + } 135 + __name(content, "content"); 136 + function attribute() { 137 + const m = match(/([\w:-]+)\s*=\s*("[^"]*"|'[^']*'|\w+)\s*/); 138 + if (!m) return; 139 + return { 140 + name: m[1], 141 + value: entities(strip(m[2])) 142 + }; 143 + } 144 + __name(attribute, "attribute"); 145 + function strip(val) { 146 + return val.replace(/^['"]|['"]$/g, ""); 147 + } 148 + __name(strip, "strip"); 149 + function entities(val) { 150 + return val.replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&amp;", "&"); 151 + } 152 + __name(entities, "entities"); 153 + function match(re) { 154 + const m = xml.match(re); 155 + if (!m) return; 156 + xml = xml.slice(m[0].length); 157 + return m; 158 + } 159 + __name(match, "match"); 160 + function eos() { 161 + return xml.length === 0; 162 + } 163 + __name(eos, "eos"); 164 + function is(prefix) { 165 + return xml.startsWith(prefix); 166 + } 167 + __name(is, "is"); 168 + } 169 + __name(parse, "parse"); 170 + 171 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/errors.ts 172 + var S3Error = class extends Error { 173 + static { 174 + __name(this, "S3Error"); 175 + } 176 + }; 177 + var InvalidArgumentError = class extends S3Error { 178 + static { 179 + __name(this, "InvalidArgumentError"); 180 + } 181 + }; 182 + var InvalidEndpointError = class extends S3Error { 183 + static { 184 + __name(this, "InvalidEndpointError"); 185 + } 186 + }; 187 + var InvalidBucketNameError = class extends S3Error { 188 + static { 189 + __name(this, "InvalidBucketNameError"); 190 + } 191 + bucketName; 192 + constructor(bucketName) { 193 + super(`Invalid bucket name: ${bucketName}`), this.bucketName = bucketName; 194 + } 195 + }; 196 + var InvalidObjectNameError = class extends S3Error { 197 + static { 198 + __name(this, "InvalidObjectNameError"); 199 + } 200 + objectName; 201 + constructor(objectName) { 202 + super(`Invalid object name: ${objectName}`), this.objectName = objectName; 203 + } 204 + }; 205 + var AccessKeyRequiredError = class extends S3Error { 206 + static { 207 + __name(this, "AccessKeyRequiredError"); 208 + } 209 + constructor() { 210 + super("accessKey is required"); 211 + } 212 + }; 213 + var SecretKeyRequiredError = class extends S3Error { 214 + static { 215 + __name(this, "SecretKeyRequiredError"); 216 + } 217 + constructor() { 218 + super("secretKey is required"); 219 + } 220 + }; 221 + var InvalidExpiryError = class extends S3Error { 222 + static { 223 + __name(this, "InvalidExpiryError"); 224 + } 225 + constructor() { 226 + super("expirySeconds cannot be less than 1 second or more than 7 days"); 227 + } 228 + }; 229 + var ServerError = class extends S3Error { 230 + static { 231 + __name(this, "ServerError"); 232 + } 233 + statusCode; 234 + code; 235 + key; 236 + bucketName; 237 + resource; 238 + region; 239 + constructor(statusCode, code, message, otherData = {}) { 240 + super(message), this.statusCode = statusCode, this.code = code; 241 + this.key = otherData.key; 242 + this.bucketName = otherData.bucketName; 243 + this.resource = otherData.resource; 244 + this.region = otherData.region; 245 + } 246 + }; 247 + async function parseServerError(response) { 248 + try { 249 + const xmlParsed = parse(await response.text()); 250 + const errorRoot = xmlParsed.root; 251 + if (errorRoot?.name !== "Error") { 252 + throw new Error("Invalid root, expected <Error>"); 253 + } 254 + const code = errorRoot.children.find((c) => c.name === "Code")?.content ?? "UnknownErrorCode"; 255 + const message = errorRoot.children.find((c) => c.name === "Message")?.content ?? "The error message could not be determined."; 256 + const key = errorRoot.children.find((c) => c.name === "Key")?.content; 257 + const bucketName = errorRoot.children.find((c) => c.name === "BucketName")?.content; 258 + const resource = errorRoot.children.find((c) => c.name === "Resource")?.content; 259 + const region = errorRoot.children.find((c) => c.name === "Region")?.content; 260 + return new ServerError(response.status, code, message, { 261 + key, 262 + bucketName, 263 + resource, 264 + region 265 + }); 266 + } catch { 267 + return new ServerError(response.status, "UnrecognizedError", `Error: Unexpected response code ${response.status} ${response.statusText}. Unable to parse response as XML.`); 268 + } 269 + } 270 + __name(parseServerError, "parseServerError"); 271 + 272 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/helpers.ts 273 + init_Buffer(); 274 + init_process(); 275 + function isValidPort(port) { 276 + if (typeof port !== "number" || isNaN(port)) { 277 + return false; 278 + } 279 + return port >= 1 && port <= 65535; 280 + } 281 + __name(isValidPort, "isValidPort"); 282 + function isValidBucketName(bucket) { 283 + if (typeof bucket !== "string") { 284 + return false; 285 + } 286 + if (bucket.length > 255) { 287 + return false; 288 + } 289 + if (bucket.includes("..")) { 290 + return false; 291 + } 292 + return Boolean(bucket.match(/^[a-zA-Z0-9][a-zA-Z0-9.-]+[a-zA-Z0-9]$/)); 293 + } 294 + __name(isValidBucketName, "isValidBucketName"); 295 + function isValidObjectName(objectName) { 296 + if (!isValidPrefix(objectName)) return false; 297 + if (objectName.length === 0) return false; 298 + return true; 299 + } 300 + __name(isValidObjectName, "isValidObjectName"); 301 + function isValidPrefix(prefix) { 302 + if (typeof prefix !== "string") return false; 303 + if (prefix.length > 1024) return false; 304 + return true; 305 + } 306 + __name(isValidPrefix, "isValidPrefix"); 307 + function bin2hex(binary) { 308 + return Array.from(binary).map((b) => b.toString(16).padStart(2, "0")).join(""); 309 + } 310 + __name(bin2hex, "bin2hex"); 311 + function sanitizeETag(etag = "") { 312 + const replaceChars = { 313 + '"': "", 314 + "&quot;": "", 315 + "&#34;": "", 316 + "&QUOT;": "", 317 + "&#x00022": "" 318 + }; 319 + return etag.replace(/^("|&quot;|&#34;)|("|&quot;|&#34;)$/g, (m) => replaceChars[m]); 320 + } 321 + __name(sanitizeETag, "sanitizeETag"); 322 + function getVersionId(headers) { 323 + return headers.get("x-amz-version-id") ?? null; 324 + } 325 + __name(getVersionId, "getVersionId"); 326 + function makeDateLong(date) { 327 + const dateStr = date.toISOString(); 328 + return dateStr.slice(0, 4) + dateStr.slice(5, 7) + dateStr.slice(8, 13) + dateStr.slice(14, 16) + dateStr.slice(17, 19) + "Z"; 329 + } 330 + __name(makeDateLong, "makeDateLong"); 331 + function makeDateShort(date) { 332 + return makeDateLong(date).slice(0, 8); 333 + } 334 + __name(makeDateShort, "makeDateShort"); 335 + function getScope(region, date) { 336 + return `${makeDateShort(date)}/${region}/s3/aws4_request`; 337 + } 338 + __name(getScope, "getScope"); 339 + async function sha256digestHex(data) { 340 + if (!(data instanceof Uint8Array)) { 341 + data = new TextEncoder().encode(data); 342 + } 343 + return bin2hex(new Uint8Array(await crypto.subtle.digest("SHA-256", data))); 344 + } 345 + __name(sha256digestHex, "sha256digestHex"); 346 + 347 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/object-uploader.ts 348 + init_Buffer(); 349 + init_process(); 350 + var multipartTagAlongMetadataKeys = [ 351 + "x-amz-server-side-encryption-customer-algorithm", 352 + "x-amz-server-side-encryption-customer-key", 353 + "x-amz-server-side-encryption-customer-key-MD5" 354 + ]; 355 + var ObjectUploader = class extends WritableStream { 356 + static { 357 + __name(this, "ObjectUploader"); 358 + } 359 + getResult; 360 + constructor({ client, bucketName, objectName, partSize, metadata }) { 361 + let result; 362 + let nextPartNumber = 1; 363 + let uploadId; 364 + const etags = []; 365 + let multiUploadError; 366 + const partsPromises = []; 367 + super({ 368 + start() { 369 + }, 370 + async write(chunk, _controller) { 371 + const method = "PUT"; 372 + const partNumber = nextPartNumber++; 373 + try { 374 + if (partNumber == 1 && chunk.length < partSize) { 375 + const response = await client.makeRequest({ 376 + method, 377 + headers: new Headers({ 378 + // Set user metadata as this is not a multipart upload 379 + ...metadata, 380 + "Content-Length": String(chunk.length) 381 + }), 382 + bucketName, 383 + objectName, 384 + payload: chunk 385 + }); 386 + result = { 387 + etag: sanitizeETag(response.headers.get("etag") ?? void 0), 388 + versionId: getVersionId(response.headers) 389 + }; 390 + return; 391 + } 392 + if (partNumber === 1) { 393 + uploadId = (await initiateNewMultipartUpload({ 394 + client, 395 + bucketName, 396 + objectName, 397 + metadata 398 + })).uploadId; 399 + } 400 + const partHeaders = { 401 + "Content-Length": String(chunk.length) 402 + }; 403 + for (const key of multipartTagAlongMetadataKeys) { 404 + const value = metadata[key]; 405 + if (value) { 406 + partHeaders[key] = value; 407 + } 408 + } 409 + const partPromise = client.makeRequest({ 410 + method, 411 + query: { 412 + partNumber: partNumber.toString(), 413 + uploadId 414 + }, 415 + headers: new Headers(partHeaders), 416 + bucketName, 417 + objectName, 418 + payload: chunk 419 + }).then((response) => { 420 + let etag = response.headers.get("etag") ?? ""; 421 + if (etag) { 422 + etag = etag.replace(/^"/, "").replace(/"$/, ""); 423 + } 424 + etags.push({ 425 + part: partNumber, 426 + etag 427 + }); 428 + return response; 429 + }); 430 + partsPromises.push(partPromise.catch((err) => { 431 + if (!multiUploadError) { 432 + multiUploadError = err; 433 + } 434 + })); 435 + } catch (err) { 436 + throw err; 437 + } 438 + }, 439 + async close() { 440 + if (result) { 441 + } else if (uploadId) { 442 + await Promise.all(partsPromises); 443 + if (multiUploadError) { 444 + throw multiUploadError; 445 + } 446 + etags.sort((a, b) => a.part > b.part ? 1 : -1); 447 + result = await completeMultipartUpload({ 448 + client, 449 + bucketName, 450 + objectName, 451 + uploadId, 452 + etags 453 + }); 454 + } else { 455 + throw new Error("Stream was closed without uploading any data."); 456 + } 457 + } 458 + }); 459 + this.getResult = () => { 460 + if (result === void 0) { 461 + throw new Error("Result is not ready. await the stream first."); 462 + } 463 + return result; 464 + }; 465 + } 466 + }; 467 + async function initiateNewMultipartUpload(options) { 468 + const method = "POST"; 469 + const headers = new Headers(options.metadata); 470 + const query = "uploads"; 471 + const response = await options.client.makeRequest({ 472 + method, 473 + bucketName: options.bucketName, 474 + objectName: options.objectName, 475 + query, 476 + headers, 477 + returnBody: true 478 + }); 479 + const responseText = await response.text(); 480 + const root = parse(responseText).root; 481 + if (!root || root.name !== "InitiateMultipartUploadResult") { 482 + throw new Error(`Unexpected response: ${responseText}`); 483 + } 484 + const uploadId = root.children.find((c) => c.name === "UploadId")?.content; 485 + if (!uploadId) { 486 + throw new Error(`Unable to get UploadId from response: ${responseText}`); 487 + } 488 + return { 489 + uploadId 490 + }; 491 + } 492 + __name(initiateNewMultipartUpload, "initiateNewMultipartUpload"); 493 + async function completeMultipartUpload({ client, bucketName, objectName, uploadId, etags }) { 494 + const payload = ` 495 + <CompleteMultipartUpload xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 496 + ${etags.map((et) => ` <Part><PartNumber>${et.part}</PartNumber><ETag>${et.etag}</ETag></Part>`).join("\n")} 497 + </CompleteMultipartUpload> 498 + `; 499 + const response = await client.makeRequest({ 500 + method: "POST", 501 + bucketName, 502 + objectName, 503 + query: `uploadId=${encodeURIComponent(uploadId)}`, 504 + payload: new TextEncoder().encode(payload), 505 + returnBody: true 506 + }); 507 + const responseText = await response.text(); 508 + const root = parse(responseText).root; 509 + if (!root || root.name !== "CompleteMultipartUploadResult") { 510 + throw new Error(`Unexpected response: ${responseText}`); 511 + } 512 + const etagRaw = root.children.find((c) => c.name === "ETag")?.content; 513 + if (!etagRaw) throw new Error(`Unable to get ETag from response: ${responseText}`); 514 + const versionId = getVersionId(response.headers); 515 + return { 516 + etag: sanitizeETag(etagRaw), 517 + versionId 518 + }; 519 + } 520 + __name(completeMultipartUpload, "completeMultipartUpload"); 521 + 522 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/signing.ts 523 + init_Buffer(); 524 + init_process(); 525 + var signV4Algorithm = "AWS4-HMAC-SHA256"; 526 + async function signV4(request) { 527 + if (!request.accessKey) { 528 + throw new AccessKeyRequiredError(); 529 + } 530 + if (!request.secretKey) { 531 + throw new SecretKeyRequiredError(); 532 + } 533 + const sha256sum = request.headers.get("x-amz-content-sha256"); 534 + if (sha256sum === null) { 535 + throw new Error("Internal S3 client error - expected x-amz-content-sha256 header, but it's missing."); 536 + } 537 + const signedHeaders = getHeadersToSign(request.headers); 538 + const canonicalRequest = getCanonicalRequest(request.method, request.path, request.headers, signedHeaders, sha256sum); 539 + const stringToSign = await getStringToSign(canonicalRequest, request.date, request.region); 540 + const signingKey = await getSigningKey(request.date, request.region, request.secretKey); 541 + const credential = getCredential(request.accessKey, request.region, request.date); 542 + const signature = bin2hex(await sha256hmac(signingKey, stringToSign)).toLowerCase(); 543 + return `${signV4Algorithm} Credential=${credential}, SignedHeaders=${signedHeaders.join(";").toLowerCase()}, Signature=${signature}`; 544 + } 545 + __name(signV4, "signV4"); 546 + async function presignV4(request) { 547 + if (!request.accessKey) { 548 + throw new AccessKeyRequiredError(); 549 + } 550 + if (!request.secretKey) { 551 + throw new SecretKeyRequiredError(); 552 + } 553 + if (request.expirySeconds < 1 || request.expirySeconds > 604800) { 554 + throw new InvalidExpiryError(); 555 + } 556 + if (!request.headers.has("Host")) { 557 + throw new Error("Internal error: host header missing"); 558 + } 559 + const resource = request.path.split("?")[0]; 560 + const queryString = request.path.split("?")[1]; 561 + const iso8601Date = makeDateLong(request.date); 562 + const signedHeaders = getHeadersToSign(request.headers); 563 + const credential = getCredential(request.accessKey, request.region, request.date); 564 + const hashedPayload = "UNSIGNED-PAYLOAD"; 565 + const newQuery = new URLSearchParams(queryString); 566 + newQuery.set("X-Amz-Algorithm", signV4Algorithm); 567 + newQuery.set("X-Amz-Credential", credential); 568 + newQuery.set("X-Amz-Date", iso8601Date); 569 + newQuery.set("X-Amz-Expires", request.expirySeconds.toString()); 570 + newQuery.set("X-Amz-SignedHeaders", signedHeaders.join(";").toLowerCase()); 571 + if (request.sessionToken) { 572 + newQuery.set("X-Amz-Security-Token", request.sessionToken); 573 + } 574 + const newQueryString = newQuery.toString().replace("+", "%20"); 575 + const signingPath = resource + "?" + newQueryString; 576 + const encodedPath = resource.split("/").map((part) => encodeURIComponent(part)).join("/"); 577 + const canonicalRequest = getCanonicalRequest(request.method, signingPath, request.headers, signedHeaders, hashedPayload); 578 + const stringToSign = await getStringToSign(canonicalRequest, request.date, request.region); 579 + const signingKey = await getSigningKey(request.date, request.region, request.secretKey); 580 + const signature = bin2hex(await sha256hmac(signingKey, stringToSign)).toLowerCase(); 581 + const presignedUrl = `${request.protocol}//${request.headers.get("Host")}${encodedPath}?${newQueryString}&X-Amz-Signature=${signature}`; 582 + return presignedUrl; 583 + } 584 + __name(presignV4, "presignV4"); 585 + function getHeadersToSign(headers) { 586 + const ignoredHeaders = [ 587 + "authorization", 588 + "content-length", 589 + "content-type", 590 + "user-agent" 591 + ]; 592 + const headersToSign = []; 593 + for (const key of headers.keys()) { 594 + if (ignoredHeaders.includes(key.toLowerCase())) { 595 + continue; 596 + } 597 + headersToSign.push(key); 598 + } 599 + headersToSign.sort(); 600 + return headersToSign; 601 + } 602 + __name(getHeadersToSign, "getHeadersToSign"); 603 + var CODES = { 604 + A: "A".charCodeAt(0), 605 + Z: "Z".charCodeAt(0), 606 + a: "a".charCodeAt(0), 607 + z: "z".charCodeAt(0), 608 + "0": "0".charCodeAt(0), 609 + "9": "9".charCodeAt(0), 610 + "/": "/".charCodeAt(0) 611 + }; 612 + var ALLOWED_BYTES = "-._~".split("").map((s) => s.charCodeAt(0)); 613 + function awsUriEncode(string, allowSlashes = false) { 614 + const bytes = new TextEncoder().encode(string); 615 + let encoded = ""; 616 + for (const byte of bytes) { 617 + if (byte >= CODES.A && byte <= CODES.Z || byte >= CODES.a && byte <= CODES.z || byte >= CODES["0"] && byte <= CODES["9"] || ALLOWED_BYTES.includes(byte) || byte == CODES["/"] && allowSlashes) { 618 + encoded += String.fromCharCode(byte); 619 + } else { 620 + encoded += "%" + byte.toString(16).padStart(2, "0").toUpperCase(); 621 + } 622 + } 623 + return encoded; 624 + } 625 + __name(awsUriEncode, "awsUriEncode"); 626 + function getCanonicalRequest(method, path, headers, headersToSign, payloadHash) { 627 + const headersArray = headersToSign.reduce((acc, headerKey) => { 628 + const val = `${headers.get(headerKey)}`.replace(/ +/g, " "); 629 + acc.push(`${headerKey.toLowerCase()}:${val}`); 630 + return acc; 631 + }, []); 632 + const requestResource = path.split("?")[0]; 633 + let requestQuery = path.split("?")[1]; 634 + if (requestQuery) { 635 + requestQuery = requestQuery.split("&").map((element) => { 636 + const [key, val] = element.split("=", 2); 637 + return awsUriEncode(decodeURIComponent(key)) + "=" + awsUriEncode(decodeURIComponent(val || "")); 638 + }).sort().join("&"); 639 + } else { 640 + requestQuery = ""; 641 + } 642 + return [ 643 + method.toUpperCase(), 644 + awsUriEncode(requestResource, true), 645 + requestQuery, 646 + headersArray.join("\n") + "\n", 647 + headersToSign.join(";").toLowerCase(), 648 + payloadHash 649 + ].join("\n"); 650 + } 651 + __name(getCanonicalRequest, "getCanonicalRequest"); 652 + async function getStringToSign(canonicalRequest, requestDate, region) { 653 + const hash = await sha256digestHex(canonicalRequest); 654 + const scope = getScope(region, requestDate); 655 + return [ 656 + signV4Algorithm, 657 + makeDateLong(requestDate), 658 + scope, 659 + hash 660 + ].join("\n"); 661 + } 662 + __name(getStringToSign, "getStringToSign"); 663 + async function getSigningKey(date, region, secretKey) { 664 + const dateLine = makeDateShort(date); 665 + const hmac1 = await sha256hmac("AWS4" + secretKey, dateLine); 666 + const hmac2 = await sha256hmac(hmac1, region); 667 + const hmac3 = await sha256hmac(hmac2, "s3"); 668 + return await sha256hmac(hmac3, "aws4_request"); 669 + } 670 + __name(getSigningKey, "getSigningKey"); 671 + function getCredential(accessKey, region, requestDate) { 672 + return `${accessKey}/${getScope(region, requestDate)}`; 673 + } 674 + __name(getCredential, "getCredential"); 675 + async function sha256hmac(secretKey, data) { 676 + const enc = new TextEncoder(); 677 + const keyObject = await crypto.subtle.importKey("raw", secretKey instanceof Uint8Array ? secretKey : enc.encode(secretKey), { 678 + name: "HMAC", 679 + hash: { 680 + name: "SHA-256" 681 + } 682 + }, false, [ 683 + "sign", 684 + "verify" 685 + ]); 686 + const signature = await crypto.subtle.sign("HMAC", keyObject, data instanceof Uint8Array ? data : enc.encode(data)); 687 + return new Uint8Array(signature); 688 + } 689 + __name(sha256hmac, "sha256hmac"); 690 + async function presignPostV4(request) { 691 + if (!request.accessKey) { 692 + throw new AccessKeyRequiredError(); 693 + } 694 + if (!request.secretKey) { 695 + throw new SecretKeyRequiredError(); 696 + } 697 + if (request.expirySeconds < 1 || request.expirySeconds > 604800) { 698 + throw new InvalidExpiryError(); 699 + } 700 + const expiration = new Date(request.date); 701 + expiration.setSeconds(expiration.getSeconds() + request.expirySeconds); 702 + const credential = getCredential(request.accessKey, request.region, request.date); 703 + const iso8601Date = makeDateLong(request.date); 704 + const fields = { 705 + "X-Amz-Algorithm": signV4Algorithm, 706 + "X-Amz-Credential": credential, 707 + "X-Amz-Date": iso8601Date, 708 + "key": request.objectKey, 709 + ...request.fields 710 + }; 711 + const conditions = [ 712 + { 713 + bucket: request.bucket 714 + }, 715 + { 716 + key: request.objectKey 717 + }, 718 + { 719 + "X-Amz-Algorithm": signV4Algorithm 720 + }, 721 + { 722 + "X-Amz-Credential": credential 723 + }, 724 + { 725 + "X-Amz-Date": iso8601Date 726 + } 727 + ]; 728 + if (request.conditions) { 729 + conditions.push(...request.conditions); 730 + } 731 + for (const [key, value] of Object.entries(request.fields || {})) { 732 + if ([ 733 + "key", 734 + "X-Amz-Algorithm", 735 + "X-Amz-Credential", 736 + "X-Amz-Date" 737 + ].includes(key)) continue; 738 + conditions.push({ 739 + [key]: value 740 + }); 741 + } 742 + const policy = { 743 + expiration: expiration.toISOString(), 744 + conditions 745 + }; 746 + const policyBytes = new TextEncoder().encode(JSON.stringify(policy)); 747 + const base64Policy = btoa(String.fromCharCode(...policyBytes)); 748 + fields["policy"] = base64Policy; 749 + const stringToSign = base64Policy; 750 + const signingKey = await getSigningKey(request.date, request.region, request.secretKey); 751 + const signature = bin2hex(await sha256hmac(signingKey, stringToSign)).toLowerCase(); 752 + fields["X-Amz-Signature"] = signature; 753 + const url = `${request.protocol}//${request.host}/${request.bucket}`; 754 + return { 755 + url, 756 + fields 757 + }; 758 + } 759 + __name(presignPostV4, "presignPostV4"); 760 + 761 + // https:https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/client.ts 762 + var metadataKeys = [ 763 + "Content-Type", 764 + "Cache-Control", 765 + "Content-Disposition", 766 + "Content-Encoding", 767 + "Content-Language", 768 + "Expires", 769 + "x-amz-checksum-sha256", 770 + "x-amz-grant-full-control", 771 + "x-amz-grant-read", 772 + "x-amz-grant-read-acp", 773 + "x-amz-grant-write-acp", 774 + "x-amz-server-side-encryption", 775 + "x-amz-storage-class", 776 + "x-amz-website-redirect-location", 777 + "x-amz-server-side-encryption-customer-algorithm", 778 + "x-amz-server-side-encryption-customer-key", 779 + "x-amz-server-side-encryption-customer-key-MD5", 780 + "x-amz-server-side-encryption-aws-kms-key-id", 781 + "x-amz-server-side-encryption-context", 782 + "x-amz-server-side-encryption-bucket-key-enabled", 783 + "x-amz-request-payer", 784 + "x-amz-tagging", 785 + "x-amz-object-lock-mode", 786 + "x-amz-object-lock-retain-until-date", 787 + "x-amz-object-lock-legal-hold", 788 + "x-amz-expected-bucket-owner" 789 + ]; 790 + var minimumPartSize = 5 * 1024 * 1024; 791 + var maximumPartSize = 5 * 1024 * 1024 * 1024; 792 + var maxObjectSize = 5 * 1024 * 1024 * 1024 * 1024; 793 + var Client = class { 794 + static { 795 + __name(this, "Client"); 796 + } 797 + host; 798 + port; 799 + protocol; 800 + accessKey; 801 + #secretKey; 802 + sessionToken; 803 + defaultBucket; 804 + region; 805 + userAgent = "s3-lite-client"; 806 + /** Use path-style requests, e.g. https://endpoint/bucket/object-key instead of https://bucket/object-key */ 807 + pathStyle; 808 + pathPrefix; 809 + constructor({ endPoint, useSSL, port, pathPrefix, ...params }) { 810 + if (/^https?:\/\//i.test(endPoint)) { 811 + if (useSSL !== void 0 || port !== void 0 || pathPrefix !== void 0) { 812 + throw new InvalidArgumentError(`useSSL/port/pathPrefix cannot be specified if endPoint is a URL.`); 813 + } 814 + try { 815 + const url = new URL(endPoint); 816 + endPoint = url.hostname; 817 + useSSL = url.protocol === "https:"; 818 + port = url.port ? parseInt(url.port, 10) : useSSL ? 443 : 80; 819 + if (url.pathname && url.pathname !== "/") { 820 + pathPrefix = url.pathname.endsWith("/") ? url.pathname.slice(0, -1) : url.pathname; 821 + } 822 + } catch { 823 + throw new InvalidEndpointError(`Invalid endPoint URL: ${endPoint}`); 824 + } 825 + } 826 + if (typeof endPoint !== "string" || endPoint.length === 0) { 827 + throw new InvalidEndpointError(`Invalid endPoint: ${endPoint}`); 828 + } 829 + if (useSSL === void 0) { 830 + useSSL = true; 831 + } 832 + if (port !== void 0 && !isValidPort(port)) { 833 + throw new InvalidArgumentError(`Invalid port: ${port}`); 834 + } 835 + if (params.accessKey && !params.secretKey) { 836 + throw new InvalidArgumentError(`If specifying access key, secret key must also be provided.`); 837 + } 838 + if (params.accessKey && params.accessKey.startsWith("ASIA") && !params.sessionToken) { 839 + throw new InvalidArgumentError(`If specifying temporary access key, session token must also be provided.`); 840 + } 841 + const defaultPort = useSSL ? 443 : 80; 842 + this.port = port ?? defaultPort; 843 + this.host = endPoint.toLowerCase() + (this.port !== defaultPort ? `:${this.port}` : ""); 844 + this.protocol = useSSL ? "https:" : "http:"; 845 + this.accessKey = params.accessKey; 846 + this.#secretKey = params.secretKey ?? ""; 847 + this.sessionToken = params.sessionToken; 848 + this.pathStyle = params.pathStyle ?? true; 849 + this.pathPrefix = pathPrefix ?? ""; 850 + this.defaultBucket = params.bucket; 851 + this.region = params.region; 852 + if (this.pathPrefix) { 853 + if (!this.pathStyle) { 854 + throw new InvalidArgumentError(`pathPrefix is incompatible with pathStyle=false`); 855 + } 856 + if (!this.pathPrefix.startsWith("/")) { 857 + throw new InvalidArgumentError(`pathPrefix should start with /`); 858 + } 859 + if (this.pathPrefix.endsWith("/")) { 860 + throw new InvalidArgumentError(`pathPrefix should not end with /`); 861 + } 862 + } 863 + } 864 + /** Internal helper method to figure out which bucket name to use for a request */ 865 + getBucketName(options) { 866 + const bucketName = options?.bucketName ?? this.defaultBucket; 867 + if (bucketName === void 0 || !isValidBucketName(bucketName)) { 868 + throw new InvalidBucketNameError(bucketName ?? ""); 869 + } 870 + return bucketName; 871 + } 872 + /** 873 + * Common code used for both "normal" requests and presigned URL requests 874 + */ 875 + buildRequestOptions(options) { 876 + const bucketName = this.getBucketName(options); 877 + const host = this.pathStyle ? this.host : `${bucketName}.${this.host}`; 878 + const headers = options.headers ?? new Headers(); 879 + headers.set("host", host); 880 + const queryAsString = typeof options.query === "object" ? new URLSearchParams(options.query).toString().replace("+", "%20") : options.query; 881 + const basePath = this.pathStyle ? `${this.pathPrefix}/${bucketName}/${options.objectName}` : `/${options.objectName}`; 882 + const querySuffix = queryAsString ? `?${queryAsString}` : ""; 883 + const path = basePath + querySuffix; 884 + const encodedPath = basePath.split("/").map((part) => encodeURIComponent(part)).join("/") + querySuffix; 885 + return { 886 + headers, 887 + host, 888 + path, 889 + encodedPath 890 + }; 891 + } 892 + /** 893 + * Make a single request to S3 894 + */ 895 + async makeRequest({ method, payload, ...options }) { 896 + const date = /* @__PURE__ */ new Date(); 897 + const { headers, host, path, encodedPath } = this.buildRequestOptions(options); 898 + const statusCode = options.statusCode ?? 200; 899 + if (method === "POST" || method === "PUT" || method === "DELETE") { 900 + if (payload === void 0) { 901 + payload = new Uint8Array(); 902 + } else if (typeof payload === "string") { 903 + payload = new TextEncoder().encode(payload); 904 + } 905 + headers.set("Content-Length", String(payload.length)); 906 + } else if (payload) { 907 + throw new Error(`Unexpected payload on ${method} request.`); 908 + } 909 + const sha256sum = await sha256digestHex(payload ?? new Uint8Array()); 910 + headers.set("x-amz-date", makeDateLong(date)); 911 + headers.set("x-amz-content-sha256", sha256sum); 912 + if (this.accessKey) { 913 + if (this.sessionToken) { 914 + headers.set("x-amz-security-token", this.sessionToken); 915 + } 916 + headers.set("authorization", await signV4({ 917 + headers, 918 + method, 919 + path, 920 + accessKey: this.accessKey, 921 + secretKey: this.#secretKey, 922 + region: this.region, 923 + date 924 + })); 925 + } 926 + const fullUrl = `${this.protocol}//${host}${encodedPath}`; 927 + const response = await fetch(fullUrl, { 928 + method, 929 + headers, 930 + body: payload 931 + }); 932 + if (response.status !== statusCode) { 933 + if (response.status >= 400) { 934 + const error = await parseServerError(response); 935 + throw error; 936 + } else if (response.status === 301) { 937 + throw new ServerError(response.status, "UnexpectedRedirect", `The server unexpectedly returned a redirect response. With AWS S3, this usually means you need to use a region-specific endpoint like "s3.us-west-2.amazonaws.com" instead of "s3.amazonaws.com"`); 938 + } 939 + throw new ServerError(response.status, "UnexpectedStatusCode", `Unexpected response code from the server (expected ${statusCode}, got ${response.status} ${response.statusText}).`); 940 + } 941 + if (!options.returnBody) { 942 + await response.body?.getReader().read(); 943 + } 944 + return response; 945 + } 946 + /** 947 + * Delete a single object. 948 + * 949 + * You can also pass a versionId to delete a specific version of an object. 950 + */ 951 + async deleteObject(objectName, options = {}) { 952 + const bucketName = this.getBucketName(options); 953 + if (!isValidObjectName(objectName)) { 954 + throw new InvalidObjectNameError(objectName); 955 + } 956 + const query = options.versionId ? { 957 + versionId: options.versionId 958 + } : {}; 959 + const headers = new Headers(); 960 + if (options.governanceBypass) { 961 + headers.set("X-Amz-Bypass-Governance-Retention", "true"); 962 + } 963 + await this.makeRequest({ 964 + method: "DELETE", 965 + bucketName, 966 + objectName, 967 + headers, 968 + query, 969 + statusCode: 204 970 + }); 971 + } 972 + /** 973 + * Check if an object with the specified key exists. 974 + */ 975 + async exists(objectName, options) { 976 + try { 977 + await this.statObject(objectName, options); 978 + return true; 979 + } catch (err) { 980 + if (err instanceof ServerError && err.statusCode === 404) { 981 + return false; 982 + } 983 + throw err; 984 + } 985 + } 986 + /** 987 + * Get an object. 988 + * 989 + * Returns a standard HTTP Response object, which has many ways of consuming the response including 990 + * `.text()`, `.json()`, `.body` (ReadableStream), `.arrayBuffer()`, and `.blob()`. 991 + */ 992 + getObject(objectName, options) { 993 + return this.getPartialObject(objectName, { 994 + ...options, 995 + offset: 0, 996 + length: 0 997 + }); 998 + } 999 + /** 1000 + * Stream a partial object, starting from the specified offset in bytes, up to the specified length in bytes. 1001 + * A length of zero will return the rest of the object from the specified offset. 1002 + * Pass a version UUID as "versionId" to download a specific version. 1003 + * 1004 + * Returns a standard HTTP Response object. 1005 + */ 1006 + async getPartialObject(objectName, { offset, length, ...options }) { 1007 + const bucketName = this.getBucketName(options); 1008 + if (!isValidObjectName(objectName)) { 1009 + throw new InvalidObjectNameError(objectName); 1010 + } 1011 + const headers = new Headers(Object.entries(options.metadata ?? {})); 1012 + let statusCode = 200; 1013 + if (offset || length) { 1014 + let range = ""; 1015 + if (offset) { 1016 + range = `bytes=${+offset}-`; 1017 + } else { 1018 + range = "bytes=0-"; 1019 + offset = 0; 1020 + } 1021 + if (length) { 1022 + range += `${+length + offset - 1}`; 1023 + } 1024 + headers.set("Range", range); 1025 + statusCode = 206; 1026 + } 1027 + const query = { 1028 + ...options.responseParams, 1029 + ...options.versionId ? { 1030 + versionId: options.versionId 1031 + } : {} 1032 + }; 1033 + return await this.makeRequest({ 1034 + method: "GET", 1035 + bucketName, 1036 + objectName, 1037 + headers, 1038 + query, 1039 + statusCode, 1040 + returnBody: true 1041 + }); 1042 + } 1043 + /** 1044 + * Low-level method to generate a pre-signed URL. 1045 + * @param method The HTTP method to use for the request 1046 + * @param objectName The object name, e.g. "path/to/file.txt" 1047 + * @param options Detailed options, such as expiry time for the pre-signed URL. Use expirySeconds to specify the expiry time; default is seven days. 1048 + */ 1049 + getPresignedUrl(method, objectName, options = {}) { 1050 + if (!this.accessKey) { 1051 + throw new AccessKeyRequiredError(); 1052 + } 1053 + if (!isValidObjectName(objectName)) { 1054 + throw new InvalidObjectNameError(objectName); 1055 + } 1056 + const { headers, path } = this.buildRequestOptions({ 1057 + objectName, 1058 + bucketName: options.bucketName, 1059 + query: options.parameters 1060 + }); 1061 + const requestDate = options.requestDate ?? /* @__PURE__ */ new Date(); 1062 + const expirySeconds = options.expirySeconds ?? 24 * 60 * 60 * 7; 1063 + return presignV4({ 1064 + protocol: this.protocol, 1065 + headers, 1066 + method, 1067 + path, 1068 + accessKey: this.accessKey, 1069 + secretKey: this.#secretKey, 1070 + sessionToken: this.sessionToken, 1071 + region: this.region, 1072 + date: requestDate, 1073 + expirySeconds 1074 + }); 1075 + } 1076 + /** 1077 + * Generate a pre-signed GET request URL. 1078 + * 1079 + * Use options.expirySeconds to override the expiration time (default is 7 days) 1080 + */ 1081 + presignedGetObject(objectName, options = {}) { 1082 + const { versionId, responseParams, ...otherOptions } = options; 1083 + const parameters = { 1084 + ...responseParams, 1085 + ...versionId ? { 1086 + versionId 1087 + } : {} 1088 + }; 1089 + return this.getPresignedUrl("GET", objectName, { 1090 + parameters, 1091 + ...otherOptions 1092 + }); 1093 + } 1094 + /** 1095 + * List objects in the bucket, optionally filtered by the given key prefix. 1096 + * 1097 + * This returns a flat list; use listObjectsGrouped() for more advanced behavior. 1098 + */ 1099 + async *listObjects(options = {}) { 1100 + for await (const result of this.listObjectsGrouped({ 1101 + ...options, 1102 + delimiter: "" 1103 + })) { 1104 + if (result.type === "Object") { 1105 + yield result; 1106 + } else { 1107 + throw new Error(`Unexpected result from listObjectsGrouped(): ${result}`); 1108 + } 1109 + } 1110 + } 1111 + /** 1112 + * List objects in the bucket, grouped based on the specified "delimiter". 1113 + * 1114 + * See https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html 1115 + */ 1116 + async *listObjectsGrouped(options) { 1117 + const bucketName = this.getBucketName(options); 1118 + let continuationToken = ""; 1119 + const pageSize = options.pageSize ?? 1e3; 1120 + if (pageSize < 1 || pageSize > 1e3) { 1121 + throw new InvalidArgumentError("pageSize must be between 1 and 1,000."); 1122 + } 1123 + let resultCount = 0; 1124 + while (true) { 1125 + const maxKeys = options.maxResults ? Math.min(pageSize, options.maxResults - resultCount) : pageSize; 1126 + if (maxKeys === 0) { 1127 + return; 1128 + } 1129 + const pageResponse = await this.makeRequest({ 1130 + method: "GET", 1131 + bucketName, 1132 + objectName: "", 1133 + query: { 1134 + "list-type": "2", 1135 + prefix: options.prefix ?? "", 1136 + delimiter: options.delimiter, 1137 + "max-keys": String(maxKeys), 1138 + ...continuationToken ? { 1139 + "continuation-token": continuationToken 1140 + } : {} 1141 + }, 1142 + returnBody: true 1143 + }); 1144 + const responseText = await pageResponse.text(); 1145 + const root = parse(responseText).root; 1146 + if (!root || root.name !== "ListBucketResult") { 1147 + throw new Error(`Unexpected response: ${responseText}`); 1148 + } 1149 + const prefixElements = root.children.filter((c) => c.name === "CommonPrefixes").flatMap((c) => c.children); 1150 + const toYield = []; 1151 + for (const prefixElement of prefixElements) { 1152 + toYield.push({ 1153 + type: "CommonPrefix", 1154 + prefix: prefixElement.content ?? "" 1155 + }); 1156 + resultCount++; 1157 + } 1158 + for (const objectElement of root.children.filter((c) => c.name === "Contents")) { 1159 + toYield.push({ 1160 + type: "Object", 1161 + key: objectElement.children.find((c) => c.name === "Key")?.content ?? "", 1162 + etag: sanitizeETag(objectElement.children.find((c) => c.name === "ETag")?.content ?? ""), 1163 + size: parseInt(objectElement.children.find((c) => c.name === "Size")?.content ?? "", 10), 1164 + lastModified: new Date(objectElement.children.find((c) => c.name === "LastModified")?.content ?? "invalid") 1165 + }); 1166 + resultCount++; 1167 + } 1168 + toYield.sort((a, b) => { 1169 + const aStr = a.type === "Object" ? a.key : a.prefix; 1170 + const bStr = b.type === "Object" ? b.key : b.prefix; 1171 + return aStr > bStr ? 1 : aStr < bStr ? -1 : 0; 1172 + }); 1173 + for (const entry of toYield) { 1174 + yield entry; 1175 + } 1176 + const isTruncated = root.children.find((c) => c.name === "IsTruncated")?.content === "true"; 1177 + if (isTruncated) { 1178 + const nextContinuationToken = root.children.find((c) => c.name === "NextContinuationToken")?.content; 1179 + if (!nextContinuationToken) { 1180 + throw new Error("Unexpectedly missing continuation token, but server said there are more results."); 1181 + } 1182 + continuationToken = nextContinuationToken; 1183 + } else { 1184 + return; 1185 + } 1186 + } 1187 + } 1188 + /** 1189 + * Upload an object 1190 + */ 1191 + async putObject(objectName, streamOrData, options) { 1192 + const bucketName = this.getBucketName(options); 1193 + if (!isValidObjectName(objectName)) { 1194 + throw new InvalidObjectNameError(objectName); 1195 + } 1196 + let size; 1197 + let stream; 1198 + if (typeof streamOrData === "string") { 1199 + const binaryData = new TextEncoder().encode(streamOrData); 1200 + if (typeof ReadableStream.from !== "undefined") { 1201 + stream = ReadableStream.from([ 1202 + binaryData 1203 + ]); 1204 + } else { 1205 + stream = new ReadableStream({ 1206 + start(c) { 1207 + c.enqueue(binaryData); 1208 + c.close(); 1209 + } 1210 + }); 1211 + } 1212 + size = binaryData.length; 1213 + } else if (streamOrData instanceof Uint8Array) { 1214 + if (typeof ReadableStream.from !== "undefined") { 1215 + stream = ReadableStream.from([ 1216 + streamOrData 1217 + ]); 1218 + } else { 1219 + stream = new ReadableStream({ 1220 + start(c) { 1221 + c.enqueue(streamOrData); 1222 + c.close(); 1223 + } 1224 + }); 1225 + } 1226 + size = streamOrData.byteLength; 1227 + } else if (streamOrData instanceof ReadableStream) { 1228 + stream = streamOrData; 1229 + } else { 1230 + throw new InvalidArgumentError(`Invalid stream/data type provided.`); 1231 + } 1232 + if (options?.size !== void 0) { 1233 + if (size !== void 0 && options?.size !== size) { 1234 + throw new InvalidArgumentError(`size was specified (${options.size}) but doesn't match auto-detected size (${size}).`); 1235 + } 1236 + if (typeof options.size !== "number" || options.size < 0 || isNaN(options.size)) { 1237 + throw new InvalidArgumentError(`invalid size specified: ${options.size}`); 1238 + } else { 1239 + size = options.size; 1240 + } 1241 + } 1242 + const partSize = options?.partSize ?? this.calculatePartSize(size); 1243 + if (partSize < minimumPartSize) { 1244 + throw new InvalidArgumentError(`Part size should be greater than 5MB`); 1245 + } else if (partSize > maximumPartSize) { 1246 + throw new InvalidArgumentError(`Part size should be less than 6MB`); 1247 + } 1248 + const chunker = new TransformChunkSizes(partSize); 1249 + const uploader = new ObjectUploader({ 1250 + client: this, 1251 + bucketName, 1252 + objectName, 1253 + partSize, 1254 + metadata: options?.metadata ?? {} 1255 + }); 1256 + await stream.pipeThrough(chunker).pipeTo(uploader); 1257 + return uploader.getResult(); 1258 + } 1259 + /** 1260 + * Calculate part size given the object size. Part size will be at least this.partSize. 1261 + * 1262 + * Per https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html we have to 1263 + * stick to the following rules: 1264 + * - part size between 5MB (this.maximumPartSize) and 5GB (this.maxObjectSize) 1265 + * (the final part can be smaller than 5MB however) 1266 + * - maximum of 10,000 parts per upload 1267 + * - maximum object size of 5TB 1268 + */ 1269 + calculatePartSize(size) { 1270 + if (size === void 0) { 1271 + size = maxObjectSize; 1272 + } 1273 + if (size > maxObjectSize) { 1274 + throw new TypeError(`size should not be more than ${maxObjectSize}`); 1275 + } 1276 + let partSize = 64 * 1024 * 1024; 1277 + while (true) { 1278 + if (partSize * 1e4 > size) { 1279 + return partSize; 1280 + } 1281 + partSize += 16 * 1024 * 1024; 1282 + } 1283 + } 1284 + /** 1285 + * Get detailed information about an object. 1286 + */ 1287 + async statObject(objectName, options) { 1288 + const bucketName = this.getBucketName(options); 1289 + if (!isValidObjectName(objectName)) { 1290 + throw new InvalidObjectNameError(objectName); 1291 + } 1292 + const query = {}; 1293 + if (options?.versionId) { 1294 + query.versionId = options.versionId; 1295 + } 1296 + const response = await this.makeRequest({ 1297 + method: "HEAD", 1298 + bucketName, 1299 + objectName, 1300 + query, 1301 + // Add custom headers if provided 1302 + headers: new Headers(options?.headers) 1303 + }); 1304 + const metadata = {}; 1305 + for (const header of metadataKeys) { 1306 + if (response.headers.has(header)) { 1307 + metadata[header] = response.headers.get(header); 1308 + } 1309 + } 1310 + response.headers.forEach((_value, key) => { 1311 + if (key.startsWith("x-amz-meta-")) { 1312 + metadata[key] = response.headers.get(key); 1313 + } 1314 + }); 1315 + return { 1316 + type: "Object", 1317 + key: objectName, 1318 + size: parseInt(response.headers.get("content-length") ?? "", 10), 1319 + metadata, 1320 + lastModified: new Date(response.headers.get("Last-Modified") ?? "error: missing last modified"), 1321 + versionId: response.headers.get("x-amz-version-id") || null, 1322 + etag: sanitizeETag(response.headers.get("ETag") ?? "") 1323 + }; 1324 + } 1325 + /** 1326 + * Copy an object into this bucket 1327 + */ 1328 + async copyObject(source, objectName, options) { 1329 + const bucketName = this.getBucketName(options); 1330 + const sourceBucketName = source.sourceBucketName ?? bucketName; 1331 + if (!isValidObjectName(objectName)) { 1332 + throw new InvalidObjectNameError(objectName); 1333 + } 1334 + let xAmzCopySource = `${sourceBucketName}/${source.sourceKey.split("/").map((part) => encodeURIComponent(part)).join("/")}`; 1335 + if (source.sourceVersionId) xAmzCopySource += `?versionId=${source.sourceVersionId}`; 1336 + const headers = new Headers(options?.metadata); 1337 + if (options?.metadata !== void 0) { 1338 + headers.set("x-amz-metadata-directive", "REPLACE"); 1339 + } 1340 + headers.set("x-amz-copy-source", xAmzCopySource); 1341 + const response = await this.makeRequest({ 1342 + method: "PUT", 1343 + bucketName, 1344 + objectName, 1345 + headers, 1346 + returnBody: true 1347 + }); 1348 + const responseText = await response.text(); 1349 + const root = parse(responseText).root; 1350 + if (!root || root.name !== "CopyObjectResult") { 1351 + throw new Error(`Unexpected response: ${responseText}`); 1352 + } 1353 + const etagString = root.children.find((c) => c.name === "ETag")?.content ?? ""; 1354 + const lastModifiedString = root.children.find((c) => c.name === "LastModified")?.content; 1355 + if (lastModifiedString === void 0) { 1356 + throw new Error("Unable to find <LastModified>...</LastModified> from the server."); 1357 + } 1358 + return { 1359 + copySourceVersionId: response.headers.get("x-amz-copy-source-version-id") || null, 1360 + etag: sanitizeETag(etagString), 1361 + lastModified: new Date(lastModifiedString), 1362 + versionId: response.headers.get("x-amz-version-id") || null 1363 + }; 1364 + } 1365 + /** Check if a bucket exists */ 1366 + async bucketExists(bucketName) { 1367 + try { 1368 + const objects = this.listObjects({ 1369 + bucketName 1370 + }); 1371 + await objects.next(); 1372 + return true; 1373 + } catch (err) { 1374 + if (err instanceof ServerError && err.statusCode === 404) { 1375 + return false; 1376 + } 1377 + throw err; 1378 + } 1379 + } 1380 + /** Create a new bucket */ 1381 + async makeBucket(bucketName) { 1382 + await this.makeRequest({ 1383 + method: "PUT", 1384 + bucketName: this.getBucketName({ 1385 + bucketName 1386 + }), 1387 + objectName: "", 1388 + statusCode: 200 1389 + }); 1390 + } 1391 + /** Delete a bucket (must be empty) */ 1392 + async removeBucket(bucketName) { 1393 + await this.makeRequest({ 1394 + method: "DELETE", 1395 + bucketName: this.getBucketName({ 1396 + bucketName 1397 + }), 1398 + objectName: "", 1399 + statusCode: 204 1400 + }); 1401 + } 1402 + /** 1403 + * Creates a presigned POST policy that can be used to allow browser/client uploads directly to S3. 1404 + * This is equivalent to AWS SDK's createPresignedPost functionality. 1405 + * 1406 + * @param objectName - Object name for which the presigned URL is generated 1407 + * @param options - Additional options 1408 + * @returns An object with url and fields that can be used to construct a form for direct uploads 1409 + */ 1410 + presignedPostObject(objectName, options = {}) { 1411 + if (!isValidObjectName(objectName)) { 1412 + throw new InvalidObjectNameError(objectName); 1413 + } 1414 + const bucketName = this.getBucketName(options); 1415 + if (!bucketName) { 1416 + throw new Error("Bucket name is required for presignedPost, but none was provided either to this method nor to the client constructor"); 1417 + } 1418 + const requestDate = options.requestDate || /* @__PURE__ */ new Date(); 1419 + const expirySeconds = options.expirySeconds ?? 3600; 1420 + return presignPostV4({ 1421 + protocol: this.protocol, 1422 + host: this.host, 1423 + bucket: bucketName, 1424 + objectKey: objectName, 1425 + accessKey: this.accessKey || "", 1426 + secretKey: this.#secretKey || "", 1427 + region: this.region, 1428 + date: requestDate, 1429 + expirySeconds, 1430 + conditions: options.conditions, 1431 + fields: options.fields 1432 + }); 1433 + } 1434 + }; 1435 + 1436 + // components/input/s3/common.js 1437 + var URI = __toESM(require_uri_all()); 1438 + function bucketsFromTracks(tracks) { 1439 + const acc = {}; 1440 + tracks.forEach((track) => { 1441 + const parsed = parseURI(track.uri); 1442 + if (!parsed) return; 1443 + const id = bucketId(parsed.bucket); 1444 + if (acc[id]) return; 1445 + acc[id] = parsed.bucket; 1446 + }); 1447 + return acc; 1448 + } 1449 + __name(bucketsFromTracks, "bucketsFromTracks"); 1450 + function bucketId(bucket) { 1451 + return `${bucket.accessKey}:${bucket.secretKey}@${bucket.host}`; 1452 + } 1453 + __name(bucketId, "bucketId"); 1454 + function buildURI(bucket, path) { 1455 + return URI.serialize({ 1456 + scheme: SCHEME, 1457 + userinfo: `${bucket.accessKey}:${bucket.secretKey}`, 1458 + host: bucket.host.replace(/^https?:\/\//, ""), 1459 + path, 1460 + query: query_string_default.stringify({ 1461 + bucketName: bucket.bucketName, 1462 + bucketPath: bucket.path, 1463 + region: bucket.region 1464 + }) 1465 + }); 1466 + } 1467 + __name(buildURI, "buildURI"); 1468 + async function consultBucket(bucket) { 1469 + const client = createClient(bucket); 1470 + return await client.bucketExists(bucket.bucketName); 1471 + } 1472 + __name(consultBucket, "consultBucket"); 1473 + function createClient(bucket) { 1474 + return new Client({ 1475 + bucket: bucket.bucketName, 1476 + endPoint: `http${bucket.host.startsWith("localhost") ? "" : "s"}://${bucket.host}`, 1477 + region: bucket.region, 1478 + pathStyle: false, 1479 + accessKey: bucket.accessKey, 1480 + secretKey: bucket.secretKey 1481 + }); 1482 + } 1483 + __name(createClient, "createClient"); 1484 + function encodeAwsUriComponent(a) { 1485 + return encodeURIComponent(a).replace( 1486 + /(\+|!|"|#|\$|&|'|\(|\)|\*|\+|,|:|;|=|\?|@)/gim, 1487 + (match) => ( 1488 + /** @type {any} */ 1489 + ENCODINGS[match] ?? match 1490 + ) 1491 + ); 1492 + } 1493 + __name(encodeAwsUriComponent, "encodeAwsUriComponent"); 1494 + function groupTracksByBucket(tracks) { 1495 + const acc = {}; 1496 + tracks.forEach((track) => { 1497 + const parsed = parseURI(track.uri); 1498 + if (!parsed) return acc; 1499 + const id = bucketId(parsed.bucket); 1500 + if (acc[id]) { 1501 + acc[id].tracks.push(track); 1502 + } else { 1503 + acc[id] = { bucket: parsed.bucket, tracks: [track] }; 1504 + } 1505 + }); 1506 + return acc; 1507 + } 1508 + __name(groupTracksByBucket, "groupTracksByBucket"); 1509 + async function loadBuckets() { 1510 + const i = await get(IDB_BUCKETS); 1511 + return i ? i : {}; 1512 + } 1513 + __name(loadBuckets, "loadBuckets"); 1514 + function parseURI(uriString) { 1515 + const uri = URI.parse(uriString); 1516 + if (uri.scheme !== SCHEME) return void 0; 1517 + if (!uri.host) return void 0; 1518 + const [accessKey, secretKey] = uri.userinfo?.split(":") ?? []; 1519 + if (!accessKey || !secretKey) return void 0; 1520 + const qs = query_string_default.parse(uri.query || ""); 1521 + const bucket = { 1522 + accessKey, 1523 + bucketName: typeof qs.bucketName === "string" ? qs.bucketName : "", 1524 + host: uri.host, 1525 + path: qs.bucketPath === "string" ? qs.bucketPath : "/", 1526 + region: typeof qs.region === "string" ? qs.region : "", 1527 + secretKey 1528 + }; 1529 + const path = (bucket.path.replace(/\/$/, "") + URI.unescapeComponent(uri.path || "")).replace( 1530 + /^\//, 1531 + "" 1532 + ); 1533 + return { bucket, path }; 1534 + } 1535 + __name(parseURI, "parseURI"); 1536 + async function saveBuckets(items) { 1537 + await set(IDB_BUCKETS, items); 1538 + } 1539 + __name(saveBuckets, "saveBuckets"); 1540 + 1541 + export { 1542 + bucketsFromTracks, 1543 + bucketId, 1544 + buildURI, 1545 + consultBucket, 1546 + createClient, 1547 + encodeAwsUriComponent, 1548 + groupTracksByBucket, 1549 + loadBuckets, 1550 + parseURI, 1551 + saveBuckets 1552 + }; 1553 + 1554 + //# sourceMappingURL=./chunk-AISBWLUT.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AISBWLUT.js.map
··· 1 + {"version":3,"sources":["/components/input/s3/common.js","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/mod.ts","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/client.ts","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/transform-chunk-sizes.ts","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/errors.ts","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/xml-parser.ts","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/helpers.ts","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/object-uploader.ts","https://jsr.io/@bradenmacdonald/s3-lite-client/0.9.5/signing.ts"],"sourcesContent":["import { S3Client } from \"@bradenmacdonald/s3-lite-client\";\nimport * as IDB from \"idb-keyval\";\nimport * as URI from \"uri-js\";\nimport QS from \"query-string\";\n\nimport { ENCODINGS, IDB_BUCKETS, SCHEME } from \"./constants.js\";\n\n/**\n * @import { Track } from \"@definitions/types.d.ts\";\n * @import { Bucket } from \"./types.d.ts\";\n */\n\n////////////////////////////////////////////\n// 🛠️\n////////////////////////////////////////////\n\n/**\n * @param {Track[]} tracks\n */\nexport function bucketsFromTracks(tracks) {\n /** @type {Record<string, Bucket>} */\n const acc = {};\n\n tracks.forEach((track) => {\n const parsed = parseURI(track.uri);\n if (!parsed) return;\n\n const id = bucketId(parsed.bucket);\n if (acc[id]) return;\n\n acc[id] = parsed.bucket;\n });\n\n return acc;\n}\n\n/**\n * @param {Bucket} bucket\n */\nexport function bucketId(bucket) {\n return `${bucket.accessKey}:${bucket.secretKey}@${bucket.host}`;\n}\n\n/**\n * @param {Bucket} bucket\n * @param {string} [path]\n */\nexport function buildURI(bucket, path) {\n return URI.serialize({\n scheme: SCHEME,\n userinfo: `${bucket.accessKey}:${bucket.secretKey}`,\n host: bucket.host.replace(/^https?:\\/\\//, \"\"),\n path: path,\n query: QS.stringify({\n bucketName: bucket.bucketName,\n bucketPath: bucket.path,\n region: bucket.region,\n }),\n });\n}\n\n/**\n * @param {Bucket} bucket\n */\nexport async function consultBucket(bucket) {\n const client = createClient(bucket);\n return await client.bucketExists(bucket.bucketName);\n}\n\n/**\n * @param {Bucket} bucket\n */\nexport function createClient(bucket) {\n return new S3Client({\n bucket: bucket.bucketName,\n endPoint: `http${\n bucket.host.startsWith(\"localhost\") ? \"\" : \"s\"\n }://${bucket.host}`,\n region: bucket.region,\n pathStyle: false,\n accessKey: bucket.accessKey,\n secretKey: bucket.secretKey,\n });\n}\n\n/**\n * @param {string} a\n */\nexport function encodeAwsUriComponent(a) {\n return encodeURIComponent(a).replace(\n /(\\+|!|\"|#|\\$|&|'|\\(|\\)|\\*|\\+|,|:|;|=|\\?|@)/gim,\n (match) => /** @type {any} */ (ENCODINGS)[match] ?? match,\n );\n}\n\n/**\n * @param {Track[]} tracks\n */\nexport function groupTracksByBucket(tracks) {\n /** @type {Record<string, { bucket: Bucket; tracks: Track[] }>} */\n const acc = {};\n\n tracks.forEach((track) => {\n const parsed = parseURI(track.uri);\n if (!parsed) return acc;\n\n const id = bucketId(parsed.bucket);\n\n if (acc[id]) {\n acc[id].tracks.push(track);\n } else {\n acc[id] = { bucket: parsed.bucket, tracks: [track] };\n }\n });\n\n return acc;\n}\n\n/**\n * @returns {Promise<Record<string, Bucket>>}\n */\nexport async function loadBuckets() {\n const i = await IDB.get(IDB_BUCKETS);\n return i ? i : {};\n}\n\n/**\n * @param {string} uriString\n * @returns {{ bucket: Bucket; path: string } | undefined}\n */\nexport function parseURI(uriString) {\n const uri = URI.parse(uriString);\n if (uri.scheme !== SCHEME) return undefined;\n if (!uri.host) return undefined;\n\n const [accessKey, secretKey] = uri.userinfo?.split(\":\") ?? [];\n if (!accessKey || !secretKey) return undefined;\n\n const qs = QS.parse(uri.query || \"\");\n\n const bucket = {\n accessKey,\n bucketName: typeof qs.bucketName === \"string\" ? qs.bucketName : \"\",\n host: uri.host,\n path: qs.bucketPath === \"string\" ? qs.bucketPath : \"/\",\n region: typeof qs.region === \"string\" ? qs.region : \"\",\n secretKey,\n };\n\n const path =\n (bucket.path.replace(/\\/$/, \"\") + URI.unescapeComponent(uri.path || \"\"))\n .replace(\n /^\\//,\n \"\",\n );\n\n return { bucket, path };\n}\n\n/**\n * @param {Record<string, Bucket>} items\n */\nexport async function saveBuckets(items) {\n await IDB.set(IDB_BUCKETS, items);\n}\n","/**\n * @module\n * A lightweight client for connecting to S3-compatible object storage services.\n */\n\nexport {\n Client as S3Client,\n type ClientOptions as S3ClientOptions,\n type CommonPrefix as S3CommonPrefix,\n type CopiedObjectInfo as S3CopiedObjectInfo,\n type ObjectMetadata as S3ObjectMetadata,\n type ObjectStatus as S3ObjectStatus,\n type PolicyCondition as S3PolicyCondition,\n type PresignedPostResult as S3PresignedPostResult,\n type ResponseOverrideParams as S3ResponseOverrideParams,\n type S3Object,\n type UploadedObjectInfo as S3UploadedObjectInfo,\n} from \"./client.ts\";\nexport * as S3Errors from \"./errors.ts\";\n","import { TransformChunkSizes } from \"./transform-chunk-sizes.ts\";\nimport * as errors from \"./errors.ts\";\nimport {\n isValidBucketName,\n isValidObjectName,\n isValidPort,\n makeDateLong,\n sanitizeETag,\n sha256digestHex,\n type Uint8Array_,\n} from \"./helpers.ts\";\nimport { ObjectUploader } from \"./object-uploader.ts\";\nimport { presignPostV4, presignV4, signV4 } from \"./signing.ts\";\nimport { parse as parseXML } from \"./xml-parser.ts\";\n\nexport interface ClientOptions {\n /**\n * The full URL of the S3 endpoint. Can also be just the hostname (deprecated).\n * Examples: \"https://s3.eu-west-1.amazonaws.com\", \"http://localhost:9000\"\n */\n endPoint: string;\n accessKey?: string;\n secretKey?: string;\n /** If using temporary credentials, a session token is required. Otherwise you don't need this. */\n sessionToken?: string;\n /** Default bucket name, if not specified on individual requests */\n bucket?: string;\n /** Region to use, e.g. \"us-east-1\" */\n region: string;\n /** Use path-style requests, e.g. https://endpoint/bucket/object-key instead of https://bucket/object-key (default: true) */\n pathStyle?: boolean | undefined;\n /**\n * Whether to use HTTPS. Defaults to true unless http:// is explicitly specified in endPoint.\n * @deprecated Pass in a complete URL to `endPoint` instead, including 'https://' or 'http://'\n */\n useSSL?: boolean | undefined;\n /**\n * Port to use. Will be extracted from URL if provided, otherwise defaults to 80/443 based on protocol.\n * @deprecated Pass in a complete URL to `endPoint` instead, including a port number if needed.\n */\n port?: number | undefined;\n /**\n * Path prefix. Usually not required, but some API servers like Supabase S3 need this.\n * e.g. If docs say \"S3 Storage URL: http://127.0.0.1:54321/storage/v1/s3\" then pathPrefix is \"/storage/v1/s3\"\n *\n * @deprecated Pass in a complete URL to `endPoint` instead.\n */\n pathPrefix?: string;\n}\n\n/**\n * Standard Metadata (headers) that can be set when interacting with an object.\n * See https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n */\nconst metadataKeys = [\n \"Content-Type\",\n \"Cache-Control\",\n \"Content-Disposition\",\n \"Content-Encoding\",\n \"Content-Language\",\n \"Expires\",\n \"x-amz-checksum-sha256\",\n \"x-amz-grant-full-control\",\n \"x-amz-grant-read\",\n \"x-amz-grant-read-acp\",\n \"x-amz-grant-write-acp\",\n \"x-amz-server-side-encryption\",\n \"x-amz-storage-class\",\n \"x-amz-website-redirect-location\",\n \"x-amz-server-side-encryption-customer-algorithm\",\n \"x-amz-server-side-encryption-customer-key\",\n \"x-amz-server-side-encryption-customer-key-MD5\",\n \"x-amz-server-side-encryption-aws-kms-key-id\",\n \"x-amz-server-side-encryption-context\",\n \"x-amz-server-side-encryption-bucket-key-enabled\",\n \"x-amz-request-payer\",\n \"x-amz-tagging\",\n \"x-amz-object-lock-mode\",\n \"x-amz-object-lock-retain-until-date\",\n \"x-amz-object-lock-legal-hold\",\n \"x-amz-expected-bucket-owner\",\n] as const;\n\n/**\n * Metadata (standard and custom) that can be set when uploading an object.\n *\n * Custom keys should be like \"x-amz-meta-...\"\n */\nexport type ObjectMetadata =\n & {\n \"x-amz-acl\"?:\n | \"private\"\n | \"public-read\"\n | \"public-read-write\"\n | \"authenticated-read\"\n | \"aws-exec-read\"\n | \"bucket-owner-read\"\n | \"bucket-owner-full-control\";\n }\n & { [K in typeof metadataKeys[number]]?: string }\n & { [customMetadata: `x-amz-meta-${string}`]: string };\n\n/** Response Header Overrides\n * These parameters can be used with an authenticated or presigned get object request, to\n * override certain headers that will be sent with the response. These cannot be used with\n * anonymous requests (although some servers like MinIO do seem to allow it).\n * See https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n */\nexport interface ResponseOverrideParams {\n \"response-content-type\"?: string;\n \"response-content-language\"?: string;\n \"response-expires\"?: string;\n \"response-cache-control\"?: string;\n \"response-content-disposition\"?: string;\n \"response-content-encoding\"?: string;\n}\n\nexport interface UploadedObjectInfo {\n etag: string;\n versionId: string | null;\n}\n\nexport interface CopiedObjectInfo extends UploadedObjectInfo {\n lastModified: Date;\n copySourceVersionId: string | null;\n}\n\n/** Details about an object as returned by a \"list objects\" operation */\nexport interface S3Object {\n type: \"Object\";\n key: string;\n lastModified: Date;\n etag: string;\n size: number;\n}\n/**\n * When listing objects and returning a delimited result (e.g. grouped by folders),\n * this represents a group of keys with a common prefix.\n * See https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html\n */\nexport interface CommonPrefix {\n type: \"CommonPrefix\";\n prefix: string;\n}\n\n/**\n * Additional properties provided by `statObject` compared to `listObjects`.\n */\nexport interface ObjectStatus extends S3Object {\n versionId: string | null;\n metadata: ObjectMetadata;\n}\n\n/** The minimum allowed part size for multi-part uploads. https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html */\nconst minimumPartSize = 5 * 1024 * 1024;\n/** The maximum allowed part size for multi-part uploads. https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html */\nconst maximumPartSize = 5 * 1024 * 1024 * 1024;\n/** The maximum allowed object size for multi-part uploads. https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html */\nconst maxObjectSize = 5 * 1024 * 1024 * 1024 * 1024;\n\n/**\n * Interface for presigned POST policy conditions\n */\nexport type PolicyCondition = Record<string, unknown> | string[];\n\n/**\n * Interface for the result of a presigned POST request\n */\nexport interface PresignedPostResult {\n /**\n * The URL to POST the form to\n */\n url: string;\n /**\n * The fields to include in the form\n */\n fields: Record<string, string>;\n}\n\n/**\n * Client for connecting to S3-compatible object storage services.\n */\nexport class Client {\n readonly host: string;\n readonly port: number;\n readonly protocol: \"https:\" | \"http:\";\n readonly accessKey?: string;\n readonly #secretKey: string;\n readonly sessionToken?: string;\n readonly defaultBucket: string | undefined;\n readonly region: string;\n readonly userAgent = \"s3-lite-client\";\n /** Use path-style requests, e.g. https://endpoint/bucket/object-key instead of https://bucket/object-key */\n readonly pathStyle: boolean;\n readonly pathPrefix?: string;\n\n constructor({ endPoint, useSSL, port, pathPrefix, ...params }: Readonly<ClientOptions>) {\n // Check if endpoint is a URL (starts with http:// or https://)\n if (/^https?:\\/\\//i.test(endPoint)) {\n if (useSSL !== undefined || port !== undefined || pathPrefix !== undefined) {\n throw new errors.InvalidArgumentError(`useSSL/port/pathPrefix cannot be specified if endPoint is a URL.`);\n }\n try {\n const url = new URL(endPoint);\n endPoint = url.hostname; // Now this is just the hostname\n useSSL = url.protocol === \"https:\";\n port = url.port ? parseInt(url.port, 10) : (useSSL ? 443 : 80);\n if (url.pathname && url.pathname !== \"/\") {\n pathPrefix = url.pathname.endsWith(\"/\") ? url.pathname.slice(0, -1) : url.pathname;\n }\n } catch {\n throw new errors.InvalidEndpointError(`Invalid endPoint URL: ${endPoint}`);\n }\n }\n\n // Now validate the extracted hostname\n if (typeof endPoint !== \"string\" || endPoint.length === 0) {\n throw new errors.InvalidEndpointError(`Invalid endPoint: ${endPoint}`);\n }\n\n // Default values if not specified.\n if (useSSL === undefined) {\n useSSL = true;\n }\n\n // Validate port\n if (port !== undefined && !isValidPort(port)) {\n throw new errors.InvalidArgumentError(`Invalid port: ${port}`);\n }\n\n // Validate credentials\n if (params.accessKey && !params.secretKey) {\n throw new errors.InvalidArgumentError(`If specifying access key, secret key must also be provided.`);\n }\n if (params.accessKey && params.accessKey.startsWith(\"ASIA\") && !params.sessionToken) {\n throw new errors.InvalidArgumentError(`If specifying temporary access key, session token must also be provided.`);\n }\n\n const defaultPort = useSSL ? 443 : 80;\n this.port = port ?? defaultPort;\n this.host = endPoint.toLowerCase() + (this.port !== defaultPort ? `:${this.port}` : \"\");\n this.protocol = useSSL ? \"https:\" : \"http:\";\n this.accessKey = params.accessKey;\n this.#secretKey = params.secretKey ?? \"\";\n this.sessionToken = params.sessionToken;\n this.pathStyle = params.pathStyle ?? true; // Default path style is true\n this.pathPrefix = pathPrefix ?? \"\";\n this.defaultBucket = params.bucket;\n this.region = params.region;\n\n if (this.pathPrefix) {\n if (!this.pathStyle) {\n throw new errors.InvalidArgumentError(`pathPrefix is incompatible with pathStyle=false`);\n }\n if (!this.pathPrefix.startsWith(\"/\")) {\n throw new errors.InvalidArgumentError(`pathPrefix should start with /`);\n }\n if (this.pathPrefix.endsWith(\"/\")) {\n throw new errors.InvalidArgumentError(`pathPrefix should not end with /`);\n }\n }\n }\n\n /** Internal helper method to figure out which bucket name to use for a request */\n protected getBucketName(options: undefined | { bucketName?: string }): string {\n const bucketName = options?.bucketName ?? this.defaultBucket;\n if (bucketName === undefined || !isValidBucketName(bucketName)) {\n throw new errors.InvalidBucketNameError(bucketName ?? \"\");\n }\n return bucketName;\n }\n\n /**\n * Common code used for both \"normal\" requests and presigned URL requests\n */\n private buildRequestOptions(options: {\n objectName: string;\n bucketName?: string;\n headers?: Headers;\n query?: string | Record<string, string>;\n }): {\n headers: Headers;\n host: string;\n path: string;\n encodedPath: string;\n } {\n const bucketName = this.getBucketName(options);\n const host = this.pathStyle ? this.host : `${bucketName}.${this.host}`;\n const headers = options.headers ?? new Headers();\n headers.set(\"host\", host);\n const queryAsString = typeof options.query === \"object\"\n ? new URLSearchParams(options.query).toString().replace(\"+\", \"%20\") // Signing requires spaces become %20, never +\n : (options.query);\n\n const basePath = this.pathStyle\n ? `${this.pathPrefix}/${bucketName}/${options.objectName}`\n : `/${options.objectName}`;\n const querySuffix = queryAsString ? `?${queryAsString}` : \"\";\n const path = basePath + querySuffix;\n // For signing, we have to use the path as-is, but for making the request we have to be sure to\n // escape the '+' and '%' characters, or we'll get signing errors, at least with some S3 servers.\n const encodedPath = basePath.split(\"/\").map((part) => encodeURIComponent(part)).join(\"/\") + querySuffix;\n return { headers, host, path, encodedPath };\n }\n\n /**\n * Make a single request to S3\n */\n public async makeRequest({ method, payload, ...options }: {\n method: \"POST\" | \"GET\" | \"PUT\" | \"DELETE\" | string;\n headers?: Headers;\n query?: string | Record<string, string>;\n objectName: string;\n bucketName?: string;\n /** The status code we expect the server to return */\n statusCode?: number;\n /** The request body */\n payload?: Uint8Array_ | string;\n /**\n * returnBody: We have to read the request body to avoid leaking resources.\n * So by default this method will read and ignore the body. If you actually\n * need it, set returnBody: true and this function won't touch it so that\n * the caller can read it.\n */\n returnBody?: boolean;\n }): Promise<Response> {\n const date = new Date();\n const { headers, host, path, encodedPath } = this.buildRequestOptions(options);\n const statusCode = options.statusCode ?? 200;\n\n if (\n method === \"POST\" || method === \"PUT\" || method === \"DELETE\"\n ) {\n if (payload === undefined) {\n payload = new Uint8Array();\n } else if (typeof payload === \"string\") {\n payload = new TextEncoder().encode(payload);\n }\n headers.set(\"Content-Length\", String(payload.length));\n } else if (payload) {\n throw new Error(`Unexpected payload on ${method} request.`);\n }\n const sha256sum = await sha256digestHex(payload ?? new Uint8Array());\n headers.set(\"x-amz-date\", makeDateLong(date));\n headers.set(\"x-amz-content-sha256\", sha256sum);\n if (this.accessKey) {\n if (this.sessionToken) {\n headers.set(\"x-amz-security-token\", this.sessionToken);\n }\n headers.set(\n \"authorization\",\n await signV4({\n headers,\n method,\n path,\n accessKey: this.accessKey,\n secretKey: this.#secretKey,\n region: this.region,\n date,\n }),\n );\n }\n\n const fullUrl = `${this.protocol}//${host}${encodedPath}`;\n\n const response = await fetch(fullUrl, {\n method,\n headers,\n body: payload,\n });\n\n if (response.status !== statusCode) {\n if (response.status >= 400) {\n const error = await errors.parseServerError(response);\n throw error;\n } else if (response.status === 301) {\n // Unfortunately we are not allowed to access the Location header to know what the new location is.\n throw new errors.ServerError(\n response.status,\n \"UnexpectedRedirect\",\n `The server unexpectedly returned a redirect response. With AWS S3, this usually means you need to use a ` +\n `region-specific endpoint like \"s3.us-west-2.amazonaws.com\" instead of \"s3.amazonaws.com\"`,\n );\n }\n throw new errors.ServerError(\n response.status,\n \"UnexpectedStatusCode\",\n `Unexpected response code from the server (expected ${statusCode}, got ${response.status} ${response.statusText}).`,\n );\n }\n if (!options.returnBody) {\n // Just read the body and ignore its contents, to avoid leaking resources.\n await response.body?.getReader().read();\n }\n return response;\n }\n\n /**\n * Delete a single object.\n *\n * You can also pass a versionId to delete a specific version of an object.\n */\n async deleteObject(\n objectName: string,\n options: { bucketName?: string; versionId?: string; governanceBypass?: boolean } = {},\n ) {\n const bucketName = this.getBucketName(options);\n if (!isValidObjectName(objectName)) {\n throw new errors.InvalidObjectNameError(objectName);\n }\n\n const query: Record<string, string> = options.versionId ? { versionId: options.versionId } : {};\n const headers = new Headers();\n if (options.governanceBypass) {\n headers.set(\"X-Amz-Bypass-Governance-Retention\", \"true\");\n }\n\n await this.makeRequest({\n method: \"DELETE\",\n bucketName,\n objectName,\n headers,\n query,\n statusCode: 204,\n });\n }\n\n /**\n * Check if an object with the specified key exists.\n */\n public async exists(\n objectName: string,\n options?: { bucketName?: string; versionId?: string; headers?: Record<string, string> },\n ): Promise<boolean> {\n try {\n await this.statObject(objectName, options);\n return true;\n } catch (err: unknown) {\n if (err instanceof errors.ServerError && err.statusCode === 404) {\n return false;\n }\n throw err;\n }\n }\n\n /**\n * Get an object.\n *\n * Returns a standard HTTP Response object, which has many ways of consuming the response including\n * `.text()`, `.json()`, `.body` (ReadableStream), `.arrayBuffer()`, and `.blob()`.\n */\n public getObject(\n objectName: string,\n options?: {\n metadata?: ObjectMetadata;\n bucketName?: string;\n versionId?: string;\n responseParams?: ResponseOverrideParams;\n },\n ): Promise<Response> {\n return this.getPartialObject(objectName, { ...options, offset: 0, length: 0 });\n }\n\n /**\n * Stream a partial object, starting from the specified offset in bytes, up to the specified length in bytes.\n * A length of zero will return the rest of the object from the specified offset.\n * Pass a version UUID as \"versionId\" to download a specific version.\n *\n * Returns a standard HTTP Response object.\n */\n public async getPartialObject(\n objectName: string,\n { offset, length, ...options }: {\n offset: number;\n length: number;\n metadata?: ObjectMetadata;\n bucketName?: string;\n versionId?: string;\n responseParams?: ResponseOverrideParams;\n },\n ): Promise<Response> {\n const bucketName = this.getBucketName(options);\n if (!isValidObjectName(objectName)) {\n throw new errors.InvalidObjectNameError(objectName);\n }\n\n const headers = new Headers(Object.entries(options.metadata ?? {}));\n let statusCode = 200; // Expected status code\n if (offset || length) {\n let range = \"\";\n if (offset) {\n range = `bytes=${+offset}-`;\n } else {\n range = \"bytes=0-\";\n offset = 0;\n }\n if (length) {\n range += `${(+length + offset) - 1}`;\n }\n headers.set(\"Range\", range);\n statusCode = 206; // HTTP 206 \"Partial Content\"\n }\n\n // Create query string options\n const query: Record<string, string> = {\n ...options.responseParams,\n ...(options.versionId ? { versionId: options.versionId } : {}),\n };\n return await this.makeRequest({\n method: \"GET\",\n bucketName,\n objectName,\n headers,\n query,\n statusCode,\n returnBody: true,\n });\n }\n\n /**\n * Low-level method to generate a pre-signed URL.\n * @param method The HTTP method to use for the request\n * @param objectName The object name, e.g. \"path/to/file.txt\"\n * @param options Detailed options, such as expiry time for the pre-signed URL. Use expirySeconds to specify the expiry time; default is seven days.\n */\n getPresignedUrl(\n method: \"GET\" | \"PUT\" | \"HEAD\" | \"DELETE\",\n objectName: string,\n options: { bucketName?: string; parameters?: Record<string, string>; expirySeconds?: number; requestDate?: Date } =\n {},\n ): Promise<string> {\n if (!this.accessKey) {\n throw new errors.AccessKeyRequiredError();\n }\n if (!isValidObjectName(objectName)) {\n throw new errors.InvalidObjectNameError(objectName);\n }\n const { headers, path } = this.buildRequestOptions({\n objectName,\n bucketName: options.bucketName,\n query: options.parameters,\n });\n const requestDate = options.requestDate ?? new Date();\n const expirySeconds = options.expirySeconds ?? 24 * 60 * 60 * 7; // default expiration is 7 days in seconds.\n\n return presignV4({\n protocol: this.protocol,\n headers,\n method,\n path,\n accessKey: this.accessKey,\n secretKey: this.#secretKey,\n sessionToken: this.sessionToken,\n region: this.region,\n date: requestDate,\n expirySeconds,\n });\n }\n\n /**\n * Generate a pre-signed GET request URL.\n *\n * Use options.expirySeconds to override the expiration time (default is 7 days)\n */\n presignedGetObject(\n objectName: string,\n options: {\n bucketName?: string;\n versionId?: string;\n responseParams?: ResponseOverrideParams;\n expirySeconds?: number;\n requestDate?: Date;\n } = {},\n ): Promise<string> {\n const { versionId, responseParams, ...otherOptions } = options;\n const parameters: Record<string, string> = {\n ...responseParams,\n ...(versionId ? { versionId } : {}),\n };\n return this.getPresignedUrl(\"GET\", objectName, { parameters, ...otherOptions });\n }\n\n /**\n * List objects in the bucket, optionally filtered by the given key prefix.\n *\n * This returns a flat list; use listObjectsGrouped() for more advanced behavior.\n */\n public async *listObjects(\n options: {\n prefix?: string;\n bucketName?: string;\n /** Don't return more than this many results in total. Default: unlimited. */\n maxResults?: number;\n /**\n * How many keys to retrieve per HTTP request (default: 1000)\n * This is a maximum; sometimes fewer keys will be returned.\n * This will not affect the shape of the result, just its efficiency.\n */\n pageSize?: number;\n } = {},\n ): AsyncGenerator<S3Object, void, undefined> {\n for await (const result of this.listObjectsGrouped({ ...options, delimiter: \"\" })) {\n // Since we didn't specify a delimiter, listObjectsGrouped() should only return\n // actual object keys, not any CommonPrefix groupings.\n if (result.type === \"Object\") {\n yield result;\n } else {\n throw new Error(`Unexpected result from listObjectsGrouped(): ${result}`);\n }\n }\n }\n\n /**\n * List objects in the bucket, grouped based on the specified \"delimiter\".\n *\n * See https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html\n */\n public async *listObjectsGrouped(\n options: {\n delimiter: string;\n prefix?: string;\n bucketName?: string;\n /** Don't return more than this many results in total. Default: unlimited. */\n maxResults?: number;\n /**\n * How many keys to retrieve per HTTP request (default: 1000)\n * This is a maximum; sometimes fewer keys will be returned.\n * This will not affect the shape of the result, just its efficiency.\n */\n pageSize?: number;\n },\n ): AsyncGenerator<S3Object | CommonPrefix, void, undefined> {\n const bucketName = this.getBucketName(options);\n let continuationToken = \"\";\n const pageSize = options.pageSize ?? 1_000;\n if (pageSize < 1 || pageSize > 1_000) {\n throw new errors.InvalidArgumentError(\"pageSize must be between 1 and 1,000.\");\n }\n let resultCount = 0; // Count the total number of results\n\n while (true) {\n // How many results to fetch in the next request:\n const maxKeys = options.maxResults ? Math.min(pageSize, options.maxResults - resultCount) : pageSize;\n if (maxKeys === 0) {\n return;\n }\n // Fetch the next page of results:\n const pageResponse = await this.makeRequest({\n method: \"GET\",\n bucketName,\n objectName: \"\",\n query: {\n \"list-type\": \"2\",\n prefix: options.prefix ?? \"\",\n delimiter: options.delimiter,\n \"max-keys\": String(maxKeys),\n ...(continuationToken ? { \"continuation-token\": continuationToken } : {}),\n },\n returnBody: true,\n });\n const responseText = await pageResponse.text();\n // Parse the response XML.\n // See https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html#API_ListObjectsV2_ResponseSyntax\n const root = parseXML(responseText).root;\n if (!root || root.name !== \"ListBucketResult\") {\n throw new Error(`Unexpected response: ${responseText}`);\n }\n // If a delimiter was specified, first return any common prefixes from this page of results:\n const prefixElements = root.children\n .filter((c) => c.name === \"CommonPrefixes\")\n .flatMap((c) => c.children);\n const toYield: Array<S3Object | CommonPrefix> = [];\n for (const prefixElement of prefixElements) {\n toYield.push({\n type: \"CommonPrefix\",\n prefix: prefixElement.content ?? \"\",\n });\n resultCount++;\n }\n // Now return all regular object keys found in the result:\n for (const objectElement of root.children.filter((c) => c.name === \"Contents\")) {\n toYield.push({\n type: \"Object\",\n key: objectElement.children.find((c) => c.name === \"Key\")?.content ?? \"\",\n etag: sanitizeETag(objectElement.children.find((c) => c.name === \"ETag\")?.content ?? \"\"),\n size: parseInt(objectElement.children.find((c) => c.name === \"Size\")?.content ?? \"\", 10),\n lastModified: new Date(objectElement.children.find((c) => c.name === \"LastModified\")?.content ?? \"invalid\"),\n });\n resultCount++;\n }\n // Now, interlace the commonprefixes and regular objects, so that the overall result stays sorted\n // in alphabetical order, instead of mixed by common prefixes first then other entries later.\n // This way guarantees consistent behavior regardless of page size.\n toYield.sort((a, b) => {\n const aStr = a.type === \"Object\" ? a.key : a.prefix;\n const bStr = b.type === \"Object\" ? b.key : b.prefix;\n return aStr > bStr ? 1 : aStr < bStr ? -1 : 0;\n });\n for (const entry of toYield) {\n yield entry;\n }\n const isTruncated = root.children.find((c) => c.name === \"IsTruncated\")?.content === \"true\";\n if (isTruncated) {\n // There are more results.\n const nextContinuationToken = root.children.find((c) => c.name === \"NextContinuationToken\")?.content;\n if (!nextContinuationToken) {\n throw new Error(\"Unexpectedly missing continuation token, but server said there are more results.\");\n }\n continuationToken = nextContinuationToken;\n } else {\n // That's it, no more results.\n return;\n }\n }\n }\n\n /**\n * Upload an object\n */\n async putObject(\n objectName: string,\n streamOrData: ReadableStream<Uint8Array> | Uint8Array | string,\n options?: {\n metadata?: ObjectMetadata;\n size?: number;\n bucketName?: string;\n /**\n * For large uploads, split them into parts of this size.\n * Default: 64MB if object size is known, 500MB if total object size is unknown.\n * This is a minimum; larger part sizes may be required for large uploads or if the total size is unknown.\n */\n partSize?: number;\n },\n ): Promise<UploadedObjectInfo> {\n const bucketName = this.getBucketName(options);\n if (!isValidObjectName(objectName)) {\n throw new errors.InvalidObjectNameError(objectName);\n }\n\n // Prepare a readable stream for the upload:\n let size: number | undefined;\n let stream: ReadableStream<Uint8Array>;\n if (typeof streamOrData === \"string\") {\n // Convert to binary using UTF-8\n const binaryData = new TextEncoder().encode(streamOrData);\n if (typeof ReadableStream.from !== \"undefined\") {\n stream = ReadableStream.from([binaryData]);\n } else {\n // ReadableStream.from is not yet supported by some runtimes :/\n // https://github.com/oven-sh/bun/issues/3700\n // https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/from_static#browser_compatibility\n // deno-fmt-ignore\n stream = new ReadableStream({ start(c) { c.enqueue(binaryData); c.close(); } });\n }\n size = binaryData.length;\n } else if (streamOrData instanceof Uint8Array) {\n if (typeof ReadableStream.from !== \"undefined\") {\n stream = ReadableStream.from([streamOrData]);\n } else {\n // deno-fmt-ignore\n stream = new ReadableStream({ start(c) { c.enqueue(streamOrData); c.close(); } });\n }\n size = streamOrData.byteLength;\n } else if (streamOrData instanceof ReadableStream) {\n stream = streamOrData;\n } else {\n throw new errors.InvalidArgumentError(\n `Invalid stream/data type provided.`,\n );\n }\n\n // Validate the size parameter\n if (options?.size !== undefined) {\n if (size !== undefined && options?.size !== size) {\n throw new errors.InvalidArgumentError(\n `size was specified (${options.size}) but doesn't match auto-detected size (${size}).`,\n );\n }\n if (typeof options.size !== \"number\" || options.size < 0 || isNaN(options.size)) {\n throw new errors.InvalidArgumentError(\n `invalid size specified: ${options.size}`,\n );\n } else {\n size = options.size;\n }\n }\n\n // Determine the part size, if we may need to do a multi-part upload.\n const partSize = options?.partSize ?? this.calculatePartSize(size);\n if (partSize < minimumPartSize) {\n throw new errors.InvalidArgumentError(`Part size should be greater than 5MB`);\n } else if (partSize > maximumPartSize) {\n throw new errors.InvalidArgumentError(`Part size should be less than 6MB`);\n }\n\n // s3 requires that all non-end chunks be at least `this.partSize`,\n // so we chunk the stream until we hit either that size or the end before\n // we flush it to s3.\n const chunker = new TransformChunkSizes(partSize);\n\n // This is a Writable stream that can be written to in order to upload\n // to the specified bucket and object automatically.\n const uploader = new ObjectUploader({\n client: this,\n bucketName,\n objectName,\n partSize,\n metadata: options?.metadata ?? {},\n });\n // stream => chunker => uploader\n await stream.pipeThrough(chunker).pipeTo(uploader);\n return uploader.getResult();\n }\n\n /**\n * Calculate part size given the object size. Part size will be at least this.partSize.\n *\n * Per https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html we have to\n * stick to the following rules:\n * - part size between 5MB (this.maximumPartSize) and 5GB (this.maxObjectSize)\n * (the final part can be smaller than 5MB however)\n * - maximum of 10,000 parts per upload\n * - maximum object size of 5TB\n */\n protected calculatePartSize(size: number | undefined): number {\n if (size === undefined) {\n // If we don't know the total size (e.g. we're streaming data), assume it's\n // the largest allowed object size, so we can guarantee the upload works\n // regardless of the total size.\n size = maxObjectSize;\n }\n if (size > maxObjectSize) {\n throw new TypeError(`size should not be more than ${maxObjectSize}`);\n }\n let partSize = 64 * 1024 * 1024; // Start with 64MB\n while (true) {\n // If partSize is big enough to accomodate the object size, then use it.\n if ((partSize * 10_000) > size) {\n return partSize;\n }\n // Try part sizes as 64MB, 80MB, 96MB etc.\n partSize += 16 * 1024 * 1024;\n }\n }\n\n /**\n * Get detailed information about an object.\n */\n public async statObject(\n objectName: string,\n options?: {\n bucketName?: string;\n versionId?: string;\n /**\n * Additional headers to include in the request\n */\n headers?: Record<string, string>;\n },\n ): Promise<ObjectStatus> {\n const bucketName = this.getBucketName(options);\n if (!isValidObjectName(objectName)) {\n throw new errors.InvalidObjectNameError(objectName);\n }\n const query: Record<string, string> = {};\n if (options?.versionId) {\n query.versionId = options.versionId;\n }\n\n const response = await this.makeRequest({\n method: \"HEAD\",\n bucketName,\n objectName,\n query,\n // Add custom headers if provided\n headers: new Headers(options?.headers),\n });\n\n const metadata: ObjectMetadata = {};\n for (const header of metadataKeys) {\n if (response.headers.has(header)) {\n metadata[header] = response.headers.get(header) as string;\n }\n }\n // Also add in custom metadata\n response.headers.forEach((_value, key) => {\n if (key.startsWith(\"x-amz-meta-\")) {\n metadata[key as `x-amz-meta-${string}`] = response.headers.get(key) as string;\n }\n });\n\n return {\n type: \"Object\",\n key: objectName,\n size: parseInt(response.headers.get(\"content-length\") ?? \"\", 10),\n metadata,\n lastModified: new Date(response.headers.get(\"Last-Modified\") ?? \"error: missing last modified\"),\n versionId: response.headers.get(\"x-amz-version-id\") || null,\n etag: sanitizeETag(response.headers.get(\"ETag\") ?? \"\"),\n };\n }\n\n /**\n * Copy an object into this bucket\n */\n public async copyObject(\n source: { sourceBucketName?: string; sourceKey: string; sourceVersionId?: string },\n objectName: string,\n options?: {\n bucketName?: string;\n /** Metadata for the new object. If not specified, metadata will be copied from the source. */\n metadata?: ObjectMetadata;\n },\n ): Promise<CopiedObjectInfo> {\n const bucketName = this.getBucketName(options);\n const sourceBucketName = source.sourceBucketName ?? bucketName;\n if (!isValidObjectName(objectName)) {\n throw new errors.InvalidObjectNameError(objectName);\n }\n\n // The \"x-amz-copy-source\" header is like \"bucket/objectkey\" with an optional version ID.\n // e.g. \"awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893\"\n let xAmzCopySource = `${sourceBucketName}/${\n source.sourceKey.split(\"/\").map((part) => encodeURIComponent(part)).join(\"/\")\n }`;\n if (source.sourceVersionId) xAmzCopySource += `?versionId=${source.sourceVersionId}`;\n\n const headers = new Headers(options?.metadata);\n if (options?.metadata !== undefined) {\n headers.set(\"x-amz-metadata-directive\", \"REPLACE\");\n }\n headers.set(\"x-amz-copy-source\", xAmzCopySource);\n\n const response = await this.makeRequest({ method: \"PUT\", bucketName, objectName, headers, returnBody: true });\n\n const responseText = await response.text();\n // Parse the response XML.\n // See https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html#API_CopyObject_ResponseSyntax\n const root = parseXML(responseText).root;\n if (!root || root.name !== \"CopyObjectResult\") {\n throw new Error(`Unexpected response: ${responseText}`);\n }\n const etagString = root.children.find((c) => c.name === \"ETag\")?.content ?? \"\";\n const lastModifiedString = root.children.find((c) => c.name === \"LastModified\")?.content;\n if (lastModifiedString === undefined) {\n throw new Error(\"Unable to find <LastModified>...</LastModified> from the server.\");\n }\n\n return {\n copySourceVersionId: response.headers.get(\"x-amz-copy-source-version-id\") || null,\n etag: sanitizeETag(etagString),\n lastModified: new Date(lastModifiedString),\n versionId: response.headers.get(\"x-amz-version-id\") || null,\n };\n }\n\n /** Check if a bucket exists */\n public async bucketExists(bucketName: string): Promise<boolean> {\n try {\n const objects = this.listObjects({ bucketName });\n // We don't need to fully list the objects, just check if we can start listing\n await objects.next();\n return true;\n } catch (err: unknown) {\n if (err instanceof errors.ServerError && err.statusCode === 404) {\n return false;\n }\n throw err;\n }\n }\n\n /** Create a new bucket */\n public async makeBucket(bucketName: string): Promise<void> {\n await this.makeRequest({\n method: \"PUT\",\n bucketName: this.getBucketName({ bucketName }),\n objectName: \"\",\n statusCode: 200,\n });\n }\n\n /** Delete a bucket (must be empty) */\n public async removeBucket(bucketName: string): Promise<void> {\n await this.makeRequest({\n method: \"DELETE\",\n bucketName: this.getBucketName({ bucketName }),\n objectName: \"\",\n statusCode: 204,\n });\n }\n\n /**\n * Creates a presigned POST policy that can be used to allow browser/client uploads directly to S3.\n * This is equivalent to AWS SDK's createPresignedPost functionality.\n *\n * @param objectName - Object name for which the presigned URL is generated\n * @param options - Additional options\n * @returns An object with url and fields that can be used to construct a form for direct uploads\n */\n presignedPostObject(\n objectName: string,\n options: {\n /**\n * Bucket name to use for this operation. If not specified, the default bucket name will be used.\n */\n bucketName?: string;\n /**\n * Expiry time in seconds for the presigned URL. Default is 1 hour (3600 seconds).\n */\n expirySeconds?: number;\n /**\n * Date when the presigned URL becomes valid. Default is now.\n */\n requestDate?: Date;\n /**\n * Additional policy conditions to apply.\n * See: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html\n */\n conditions?: PolicyCondition[];\n /**\n * Additional form fields to include in the policy and the result.\n */\n fields?: Record<string, string>;\n } = {},\n ): Promise<PresignedPostResult> {\n if (!isValidObjectName(objectName)) {\n throw new errors.InvalidObjectNameError(objectName);\n }\n\n const bucketName = this.getBucketName(options);\n if (!bucketName) {\n throw new Error(\n \"Bucket name is required for presignedPost, but none was provided either to this method nor to the client constructor\",\n );\n }\n\n // Build request options\n const requestDate = options.requestDate || new Date();\n const expirySeconds = options.expirySeconds ?? 3600; // Default 1 hour\n\n return presignPostV4({\n protocol: this.protocol,\n host: this.host,\n bucket: bucketName,\n objectKey: objectName,\n accessKey: this.accessKey || \"\",\n secretKey: this.#secretKey || \"\",\n region: this.region,\n date: requestDate,\n expirySeconds,\n conditions: options.conditions,\n fields: options.fields,\n });\n }\n}\n","/**\n * This stream transform will buffer the data it receives until it has enough to form\n * a chunk of the specified size, then pass on the data in chunks of the specified size.\n */\nexport class TransformChunkSizes extends TransformStream<Uint8Array, Uint8Array> {\n constructor(private readonly outChunkSize: number) {\n // We'll keep one internal buffer of size outChunkSize,\n // plus a current \"offset\" telling us how many bytes are in it.\n let buffer = new Uint8Array(outChunkSize);\n let offset = 0;\n\n super({\n transform(chunk, controller) {\n let pos = 0;\n while (pos < chunk.length) {\n // How many bytes remain to fill the buffer?\n const needed = outChunkSize - offset;\n // How many bytes we can copy from the incoming chunk this iteration\n const toCopy = Math.min(needed, chunk.length - pos);\n\n // Copy from chunk into our internal buffer\n buffer.set(chunk.subarray(pos, pos + toCopy), offset);\n pos += toCopy;\n offset += toCopy;\n\n // If we've filled a chunk, push it to the output, then reset\n if (offset === outChunkSize) {\n controller.enqueue(buffer);\n // We must not reuse that buffer, because it's still being read by the controller.\n buffer = new Uint8Array(outChunkSize);\n offset = 0;\n }\n }\n },\n flush(controller) {\n // If anything remains in the buffer at the end, enqueue it.\n if (offset > 0) {\n controller.enqueue(buffer.subarray(0, offset));\n }\n },\n });\n }\n}\n","/**\n * @module\n * All the errors which can be thrown by this S3 client.\n * Every error is a subclass of S3Error.\n */\n\nimport { parse as parseXML } from \"./xml-parser.ts\";\n\n/**\n * Base class for all errors raised by this S3 client.\n */\nexport class S3Error extends Error {}\n\n// Preserve API compatibility with the old name:\n/** @deprecated Use `S3Error` instead. */\nexport const DenoS3LiteClientError = S3Error;\n\n/**\n * An argument or configuration parameter was invalid.\n */\nexport class InvalidArgumentError extends S3Error {}\n\n/**\n * InvalidEndpointError is generated when an invalid end point value is\n * provided which does not follow domain standards.\n */\nexport class InvalidEndpointError extends S3Error {}\n\n/**\n * InvalidBucketNameError is generated when an invalid bucket name is\n * provided which does not follow AWS S3 specifications.\n * http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html\n */\nexport class InvalidBucketNameError extends S3Error {\n constructor(public readonly bucketName: string) {\n super(`Invalid bucket name: ${bucketName}`);\n }\n}\n\n/**\n * InvalidObjectNameError is generated when an invalid object name is\n * provided which does not follow AWS S3 specifications.\n * http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html\n */\nexport class InvalidObjectNameError extends S3Error {\n constructor(public readonly objectName: string) {\n super(`Invalid object name: ${objectName}`);\n }\n}\n\n/** The request cannot be made without an access key to authenticate it */\nexport class AccessKeyRequiredError extends S3Error {\n constructor() {\n super(\"accessKey is required\");\n }\n}\n\n/** The request cannot be made without a secret key to authenticate it */\nexport class SecretKeyRequiredError extends S3Error {\n constructor() {\n super(\"secretKey is required\");\n }\n}\n\n/** The expiration time for the request is invalid */\nexport class InvalidExpiryError extends S3Error {\n constructor() {\n super(\"expirySeconds cannot be less than 1 second or more than 7 days\");\n }\n}\n\n/** Any error thrown by the server */\nexport class ServerError extends S3Error {\n readonly key: string | undefined;\n readonly bucketName: string | undefined;\n readonly resource: string | undefined;\n readonly region: string | undefined;\n\n constructor(\n public readonly statusCode: number,\n public readonly code: string,\n message: string,\n otherData: { key?: string; bucketName?: string; resource?: string; region?: string } = {},\n ) {\n super(message);\n this.key = otherData.key;\n this.bucketName = otherData.bucketName;\n this.resource = otherData.resource;\n this.region = otherData.region;\n }\n}\n\n/** Helper function to parse an error returned by the S3 server. */\nexport async function parseServerError(response: Response): Promise<ServerError> {\n try {\n const xmlParsed = parseXML(await response.text());\n const errorRoot = xmlParsed.root;\n if (errorRoot?.name !== \"Error\") {\n throw new Error(\"Invalid root, expected <Error>\");\n }\n const code = errorRoot.children.find((c) => c.name === \"Code\")?.content ?? \"UnknownErrorCode\";\n const message = errorRoot.children.find((c) => c.name === \"Message\")?.content ??\n \"The error message could not be determined.\";\n const key = errorRoot.children.find((c) => c.name === \"Key\")?.content;\n const bucketName = errorRoot.children.find((c) => c.name === \"BucketName\")?.content;\n const resource = errorRoot.children.find((c) => c.name === \"Resource\")?.content; // e.g. the object key\n const region = errorRoot.children.find((c) => c.name === \"Region\")?.content;\n return new ServerError(response.status, code, message, { key, bucketName, resource, region });\n } catch {\n return new ServerError(\n response.status,\n \"UnrecognizedError\",\n `Error: Unexpected response code ${response.status} ${response.statusText}. Unable to parse response as XML.`,\n );\n }\n}\n","/**\n * Basic XML parser for Deno\n * https://github.com/nekobato/deno-xml-parser\n * By Hayato Koriyama, MIT licensed\n * Based on https://github.com/segmentio/xml-parser (MIT licensed)\n * \"Simple non-compliant XML parser because we just need to parse some basic responses\"\n */\n\ninterface Document {\n declaration: {\n attributes: Record<string, string>;\n };\n root: Xml | undefined;\n}\n\ninterface Xml {\n name: string;\n attributes: Record<string, string>;\n content?: string;\n children: Xml[];\n}\n\n/**\n * Parse the given string of `xml`.\n */\nexport function parse(xml: string): Document {\n xml = xml.trim();\n\n // strip comments\n xml = xml.replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n return document();\n\n /**\n * XML document.\n */\n function document(): Document {\n return {\n declaration: declaration(),\n root: tag(),\n };\n }\n\n /**\n * Declaration.\n */\n function declaration() {\n const m = match(/^<\\?xml\\s*/);\n if (!m) return;\n\n // tag.\n // deno-lint-ignore no-explicit-any\n const node: any = {\n attributes: {},\n };\n\n // attributes\n while (!(eos() || is(\"?>\"))) {\n const attr = attribute();\n if (!attr) return node;\n node.attributes[attr.name] = attr.value;\n }\n\n match(/\\?>\\s*/);\n\n return node;\n }\n\n /**\n * Tag.\n */\n function tag() {\n const m = match(/^<([\\w-:.]+)\\s*/);\n if (!m) return;\n\n // name\n const node: Xml = {\n name: m[1],\n attributes: {},\n children: [],\n };\n\n // attributes\n while (!(eos() || is(\">\") || is(\"?>\") || is(\"/>\"))) {\n const attr = attribute();\n if (!attr) return node;\n node.attributes[attr.name] = attr.value;\n }\n\n // self closing tag\n if (match(/^\\s*\\/>\\s*/)) {\n return node;\n }\n\n match(/\\??>\\s*/);\n\n // content\n node.content = content();\n\n // children\n let child;\n while ((child = tag())) {\n node.children.push(child);\n }\n\n // closing\n match(/^<\\/[\\w-:.]+>\\s*/);\n\n return node;\n }\n\n /**\n * Text content.\n */\n function content() {\n const m = match(/^([^<]*)/);\n if (m) return entities(m[1]);\n return \"\";\n }\n\n /**\n * Attribute.\n */\n function attribute() {\n const m = match(/([\\w:-]+)\\s*=\\s*(\"[^\"]*\"|'[^']*'|\\w+)\\s*/);\n if (!m) return;\n return { name: m[1], value: entities(strip(m[2])) };\n }\n\n /**\n * Strip quotes from `val`.\n */\n function strip(val: string) {\n return val.replace(/^['\"]|['\"]$/g, \"\");\n }\n\n /** Basic handling of entities: &amp; &lt; &gt; */\n function entities(val: string) {\n return val.replaceAll(\"&lt;\", \"<\").replaceAll(\"&gt;\", \">\").replaceAll(\"&amp;\", \"&\");\n }\n\n /**\n * Match `re` and advance the string.\n */\n function match(re: RegExp) {\n const m = xml.match(re);\n if (!m) return;\n xml = xml.slice(m[0].length);\n return m;\n }\n\n /**\n * End-of-source.\n */\n function eos() {\n return xml.length === 0;\n }\n\n /**\n * Check for `prefix`.\n */\n function is(prefix: string) {\n return xml.startsWith(prefix);\n }\n}\n","/**\n * For TypeScript 5.7+ we have to write `Uint8Array<ArrayBuffer>` instead of\n * `Uint8Array` or we'll get type errors in various places where arrays based\n * on SharedArrayBuffer are not allowed. This type alias will work both pre-\n * and post- TypeScript 5.7. Yes this is annoying.\n */\nexport type Uint8Array_ = ReturnType<Uint8Array[\"slice\"]>;\n\nexport function isValidPort(port: number) {\n // verify if port is a number.\n if (typeof port !== \"number\" || isNaN(port)) {\n return false;\n }\n // Verify if port is in range.\n return port >= 1 && port <= 65535;\n}\n\n/**\n * Validate a bucket name.\n *\n * This is pretty minimal, general validation. We let the remote\n * S3 server do detailed validation.\n *\n * https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html\n */\nexport function isValidBucketName(bucket: string): boolean {\n if (typeof bucket !== \"string\") {\n return false;\n }\n // Generally the bucket name length limit is 63, but\n // \"Before March 1, 2018, buckets created in the US East (N. Virginia)\n // Region could have names that were up to 255 characters long\"\n if (bucket.length > 255) {\n return false;\n }\n // \"Bucket names must not contain two adjacent periods.\"\n if (bucket.includes(\"..\")) {\n return false;\n }\n // \"Bucket names must begin and end with a letter or number.\"\n // \"Bucket names can consist only of lowercase letters, numbers,\n // periods (.), and hyphens (-).\"\n // -> Most S3 servers require lowercase bucket names but some allow\n // uppercase (Backblaze, AWS us-east buckets created before 2018)\n return Boolean(bucket.match(/^[a-zA-Z0-9][a-zA-Z0-9.-]+[a-zA-Z0-9]$/));\n}\n\n/**\n * check if objectName is a valid object name\n * http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html\n */\nexport function isValidObjectName(objectName: string) {\n if (!isValidPrefix(objectName)) return false;\n if (objectName.length === 0) return false;\n return true;\n}\n\n// check if prefix is valid\nexport function isValidPrefix(prefix: string) {\n if (typeof prefix !== \"string\") return false;\n if (prefix.length > 1024) return false;\n return true;\n}\n\n/**\n * Convert some binary data to a hex string\n */\nexport function bin2hex(binary: Uint8Array) {\n return Array.from(binary).map((b) => b.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n}\n\nexport function sanitizeETag(etag = \"\") {\n const replaceChars: Record<string, string> = {\n '\"': \"\",\n \"&quot;\": \"\",\n \"&#34;\": \"\",\n \"&QUOT;\": \"\",\n \"&#x00022\": \"\",\n };\n return etag.replace(\n /^(\"|&quot;|&#34;)|(\"|&quot;|&#34;)$/g,\n (m) => replaceChars[m],\n );\n}\n\nexport function getVersionId(headers: Headers): string | null {\n return headers.get(\"x-amz-version-id\") ?? null;\n}\n\n/** Create a Date string with format: 'YYYYMMDDTHHmmss' + Z */\nexport function makeDateLong(date: Date) {\n // Gives format like: '2017-08-07T16:28:59.889Z'\n const dateStr = date.toISOString();\n\n return dateStr.slice(0, 4) +\n dateStr.slice(5, 7) +\n dateStr.slice(8, 13) +\n dateStr.slice(14, 16) +\n dateStr.slice(17, 19) + \"Z\";\n}\n\n/** Create a Date string with format: 'YYYYMMDD' */\nexport function makeDateShort(date: Date) {\n return makeDateLong(date).slice(0, 8);\n}\n\nexport function getScope(region: string, date: Date) {\n return `${makeDateShort(date)}/${region}/s3/aws4_request`;\n}\n\nexport async function sha256digestHex(data: Uint8Array_ | string) {\n if (!(data instanceof Uint8Array)) {\n data = new TextEncoder().encode(data);\n }\n return bin2hex(new Uint8Array(await crypto.subtle.digest(\"SHA-256\", data)));\n}\n","import type { Client, ObjectMetadata, UploadedObjectInfo } from \"./client.ts\";\nimport { getVersionId, sanitizeETag, type Uint8Array_ } from \"./helpers.ts\";\nimport { parse as parseXML } from \"./xml-parser.ts\";\n\n// Metadata headers that must be included in each part of a multi-part upload\nconst multipartTagAlongMetadataKeys = [\n \"x-amz-server-side-encryption-customer-algorithm\",\n \"x-amz-server-side-encryption-customer-key\",\n \"x-amz-server-side-encryption-customer-key-MD5\",\n];\n\n/**\n * Stream a file to S3\n *\n * We assume that TransformChunkSizes has been used first, so that this stream\n * will always receive chunks of exactly size \"partSize\", except for the final\n * chunk.\n *\n * Note that the total size of the upload doesn't have to be known in advance,\n * as long as TransformChunkSizes was used first. Then this ObjectUploader\n * will decide based on the size of the first chunk whether it is doing a\n * single-request upload or a multi-part upload.\n */\nexport class ObjectUploader extends WritableStream<Uint8Array_> {\n public readonly getResult: () => UploadedObjectInfo;\n\n constructor({ client, bucketName, objectName, partSize, metadata }: {\n client: Client;\n bucketName: string;\n objectName: string;\n partSize: number;\n metadata: Record<string, string>;\n }) {\n let result: UploadedObjectInfo;\n let nextPartNumber = 1;\n let uploadId: string;\n const etags: { part: number; etag: string }[] = [];\n /** If an error occurs during multi-part uploads, we temporarily store it here. */\n let multiUploadError: Error | undefined;\n /** If doing multi-part upload, this holds a promise for each part so we can upload them in parallel */\n const partsPromises: Promise<Response | void>[] = [];\n\n super({\n start() {}, // required\n async write(chunk, _controller) {\n const method = \"PUT\";\n const partNumber = nextPartNumber++;\n\n try {\n // We are going to upload this file in a single part, because it's small enough\n if (partNumber == 1 && chunk.length < partSize) {\n // PUT the chunk in a single request — use an empty query.\n const response = await client.makeRequest({\n method,\n headers: new Headers({\n // Set user metadata as this is not a multipart upload\n ...metadata,\n \"Content-Length\": String(chunk.length),\n }),\n bucketName,\n objectName,\n payload: chunk,\n });\n result = {\n etag: sanitizeETag(response.headers.get(\"etag\") ?? undefined),\n versionId: getVersionId(response.headers),\n };\n return;\n }\n\n /// If we get here, this is a streaming upload in multiple parts.\n if (partNumber === 1) {\n uploadId = (await initiateNewMultipartUpload({\n client,\n bucketName,\n objectName,\n metadata,\n })).uploadId;\n }\n // Upload the next part\n const partHeaders: Record<string, string> = {\n \"Content-Length\": String(chunk.length),\n };\n for (const key of multipartTagAlongMetadataKeys) {\n const value = metadata[key];\n if (value) {\n partHeaders[key] = value;\n }\n }\n const partPromise = client.makeRequest({\n method,\n query: { partNumber: partNumber.toString(), uploadId },\n headers: new Headers(partHeaders),\n bucketName: bucketName,\n objectName: objectName,\n payload: chunk,\n }).then((response) => {\n // In order to aggregate the parts together, we need to collect the etags.\n let etag = response.headers.get(\"etag\") ?? \"\";\n if (etag) {\n etag = etag.replace(/^\"/, \"\").replace(/\"$/, \"\");\n }\n etags.push({ part: partNumber, etag });\n return response;\n });\n // We can't `await partPromise` now, because that will cause the uploads to\n // happen in series instead of parallel. But we don't want to let the promise\n // throw an exception when we haven't awaited it, because that can cause the\n // process to crash. So use .catch() to watch for errors and store them in\n // `multiUploadError` if they occur.\n partsPromises.push(partPromise.catch((err) => {\n // An error occurred when uploading this one part:\n if (!multiUploadError) {\n multiUploadError = err;\n }\n }));\n } catch (err) {\n // Throwing an error will make future writes to this sink fail.\n throw err;\n }\n },\n async close() {\n if (result) {\n // This was already completed, in a single upload. Nothing more to do.\n } else if (uploadId) {\n // Wait for all parts to finish uploading (or fail)\n await Promise.all(partsPromises);\n if (multiUploadError) {\n // One or more parts failed to upload:\n throw multiUploadError;\n }\n // Sort the etags (required)\n etags.sort((a, b) => a.part > b.part ? 1 : -1);\n // Complete the multi-part upload\n result = await completeMultipartUpload({ client, bucketName, objectName, uploadId, etags });\n } else {\n throw new Error(\"Stream was closed without uploading any data.\");\n }\n },\n });\n this.getResult = () => {\n if (result === undefined) {\n throw new Error(\"Result is not ready. await the stream first.\");\n }\n return result;\n };\n }\n}\n\n/** Initiate a new multipart upload request. */\nasync function initiateNewMultipartUpload(\n options: {\n client: Client;\n bucketName: string;\n objectName: string;\n metadata?: ObjectMetadata;\n },\n): Promise<{ uploadId: string }> {\n const method = \"POST\";\n const headers = new Headers(options.metadata);\n const query = \"uploads\";\n const response = await options.client.makeRequest({\n method,\n bucketName: options.bucketName,\n objectName: options.objectName,\n query,\n headers,\n returnBody: true,\n });\n // Response is like:\n // <InitiateMultipartUploadResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n // <Bucket>dev-bucket</Bucket>\n // <Key>test-32m.dat</Key>\n // <UploadId>422f976b-35e0-4a55-aca7-bf2d46277f93</UploadId>\n // </InitiateMultipartUploadResult>\n const responseText = await response.text();\n const root = parseXML(responseText).root;\n if (!root || root.name !== \"InitiateMultipartUploadResult\") {\n throw new Error(`Unexpected response: ${responseText}`);\n }\n const uploadId = root.children.find((c) => c.name === \"UploadId\")?.content;\n if (!uploadId) {\n throw new Error(`Unable to get UploadId from response: ${responseText}`);\n }\n return { uploadId };\n}\n\nasync function completeMultipartUpload(\n { client, bucketName, objectName, uploadId, etags }: {\n client: Client;\n bucketName: string;\n objectName: string;\n uploadId: string;\n etags: { part: number; etag: string }[];\n },\n): Promise<UploadedObjectInfo> {\n const payload = `\n <CompleteMultipartUpload xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n ${etags.map((et) => ` <Part><PartNumber>${et.part}</PartNumber><ETag>${et.etag}</ETag></Part>`).join(\"\\n\")}\n </CompleteMultipartUpload>\n `;\n const response = await client.makeRequest({\n method: \"POST\",\n bucketName,\n objectName,\n query: `uploadId=${encodeURIComponent(uploadId)}`,\n payload: new TextEncoder().encode(payload),\n returnBody: true,\n });\n const responseText = await response.text();\n // Example response:\n // <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n // <CompleteMultipartUploadResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n // <Location>http://localhost:9000/dev-bucket/test-32m.dat</Location>\n // <Bucket>dev-bucket</Bucket>\n // <Key>test-32m.dat</Key>\n // <ETag>&#34;4581589392ae60eafdb031f441858c7a-7&#34;</ETag>\n // </CompleteMultipartUploadResult>\n const root = parseXML(responseText).root;\n if (!root || root.name !== \"CompleteMultipartUploadResult\") {\n throw new Error(`Unexpected response: ${responseText}`);\n }\n const etagRaw = root.children.find((c) => c.name === \"ETag\")?.content;\n if (!etagRaw) throw new Error(`Unable to get ETag from response: ${responseText}`);\n const versionId = getVersionId(response.headers);\n return {\n etag: sanitizeETag(etagRaw),\n versionId,\n };\n}\n","import * as errors from \"./errors.ts\";\nimport { bin2hex, getScope, makeDateLong, makeDateShort, sha256digestHex, type Uint8Array_ } from \"./helpers.ts\";\n\nconst signV4Algorithm = \"AWS4-HMAC-SHA256\";\n\n/**\n * Generate the Authorization header required to authenticate an S3/AWS request.\n */\nexport async function signV4(request: {\n headers: Headers;\n method: string;\n path: string;\n accessKey: string;\n secretKey: string;\n region: string;\n date: Date;\n}): Promise<string> {\n if (!request.accessKey) {\n throw new errors.AccessKeyRequiredError();\n }\n if (!request.secretKey) {\n throw new errors.SecretKeyRequiredError();\n }\n\n const sha256sum = request.headers.get(\"x-amz-content-sha256\");\n if (sha256sum === null) {\n throw new Error(\n \"Internal S3 client error - expected x-amz-content-sha256 header, but it's missing.\",\n );\n }\n\n const signedHeaders = getHeadersToSign(request.headers);\n const canonicalRequest = getCanonicalRequest(\n request.method,\n request.path,\n request.headers,\n signedHeaders,\n sha256sum,\n );\n const stringToSign = await getStringToSign(\n canonicalRequest,\n request.date,\n request.region,\n );\n const signingKey = await getSigningKey(\n request.date,\n request.region,\n request.secretKey,\n );\n const credential = getCredential(\n request.accessKey,\n request.region,\n request.date,\n );\n const signature = bin2hex(await sha256hmac(signingKey, stringToSign))\n .toLowerCase();\n\n return `${signV4Algorithm} Credential=${credential}, SignedHeaders=${\n signedHeaders.join(\";\").toLowerCase()\n }, Signature=${signature}`;\n}\n\n/**\n * Generate a pre-signed URL\n */\nexport async function presignV4(request: {\n protocol: \"http:\" | \"https:\";\n headers: Headers;\n method: string;\n path: string;\n accessKey: string;\n secretKey: string;\n sessionToken?: string;\n region: string;\n date: Date;\n expirySeconds: number;\n}): Promise<string> {\n if (!request.accessKey) {\n throw new errors.AccessKeyRequiredError();\n }\n if (!request.secretKey) {\n throw new errors.SecretKeyRequiredError();\n }\n if (request.expirySeconds < 1 || request.expirySeconds > 604800) {\n throw new errors.InvalidExpiryError();\n }\n if (!request.headers.has(\"Host\")) {\n throw new Error(\"Internal error: host header missing\");\n }\n\n // Information about the future request that we're going to sign:\n const resource = request.path.split(\"?\")[0];\n const queryString = request.path.split(\"?\")[1];\n const iso8601Date = makeDateLong(request.date);\n const signedHeaders = getHeadersToSign(request.headers);\n const credential = getCredential(request.accessKey, request.region, request.date);\n const hashedPayload = \"UNSIGNED-PAYLOAD\";\n\n // Build the query string for our new signed URL:\n const newQuery = new URLSearchParams(queryString);\n newQuery.set(\"X-Amz-Algorithm\", signV4Algorithm);\n newQuery.set(\"X-Amz-Credential\", credential);\n newQuery.set(\"X-Amz-Date\", iso8601Date);\n newQuery.set(\"X-Amz-Expires\", request.expirySeconds.toString());\n newQuery.set(\"X-Amz-SignedHeaders\", signedHeaders.join(\";\").toLowerCase());\n if (request.sessionToken) {\n newQuery.set(\"X-Amz-Security-Token\", request.sessionToken);\n }\n const newQueryString = newQuery.toString().replace(\"+\", \"%20\"); // Signing requires spaces become %20, never +\n const signingPath = resource + \"?\" + newQueryString;\n const encodedPath = resource.split(\"/\").map((part) => encodeURIComponent(part)).join(\"/\");\n\n const canonicalRequest = getCanonicalRequest(\n request.method,\n signingPath,\n request.headers,\n signedHeaders,\n hashedPayload,\n );\n const stringToSign = await getStringToSign(canonicalRequest, request.date, request.region);\n const signingKey = await getSigningKey(request.date, request.region, request.secretKey);\n const signature = bin2hex(await sha256hmac(signingKey, stringToSign)).toLowerCase();\n // deno-fmt-ignore\n const presignedUrl = `${request.protocol}//${request.headers.get(\"Host\")}${encodedPath}?${newQueryString}&X-Amz-Signature=${signature}`;\n return presignedUrl;\n}\n\n/**\n * Given the set of HTTP headers that we'll be sending with an S3/AWS request, determine which\n * headers will be signed, and in what order.\n */\nfunction getHeadersToSign(headers: Headers): string[] {\n // Excerpts from @lsegal - https://github.com/aws/aws-sdk-js/issues/659#issuecomment-120477258\n //\n // User-Agent:\n //\n // This is ignored from signing because signing this causes problems with generating pre-signed URLs\n // (that are executed by other agents) or when customers pass requests through proxies, which may\n // modify the user-agent.\n //\n // Content-Length:\n //\n // This is ignored from signing because generating a pre-signed URL should not provide a content-length\n // constraint, specifically when vending a S3 pre-signed PUT URL. The corollary to this is that when\n // sending regular requests (non-pre-signed), the signature contains a checksum of the body, which\n // implicitly validates the payload length (since changing the number of bytes would change the checksum)\n // and therefore this header is not valuable in the signature.\n //\n // Content-Type:\n //\n // Signing this header causes quite a number of problems in browser environments, where browsers\n // like to modify and normalize the content-type header in different ways. There is more information\n // on this in https://github.com/aws/aws-sdk-js/issues/244. Avoiding this field simplifies logic\n // and reduces the possibility of future bugs\n //\n // Authorization:\n //\n // Is skipped for obvious reasons\n\n const ignoredHeaders = [\n \"authorization\",\n \"content-length\",\n \"content-type\",\n \"user-agent\",\n ];\n const headersToSign = [];\n for (const key of headers.keys()) {\n if (ignoredHeaders.includes(key.toLowerCase())) {\n continue; // Ignore this header\n }\n headersToSign.push(key);\n }\n headersToSign.sort();\n return headersToSign;\n}\n\nconst CODES = {\n A: \"A\".charCodeAt(0),\n Z: \"Z\".charCodeAt(0),\n a: \"a\".charCodeAt(0),\n z: \"z\".charCodeAt(0),\n \"0\": \"0\".charCodeAt(0),\n \"9\": \"9\".charCodeAt(0),\n \"/\": \"/\".charCodeAt(0),\n};\nconst ALLOWED_BYTES = \"-._~\".split(\"\").map((s) => s.charCodeAt(0));\n\n/**\n * Canonical URI encoding for signing, per AWS documentation:\n * 1. URI encode every byte except the unreserved characters:\n * 'A'-'Z', 'a'-'z', '0'-'9', '-', '.', '_', and '~'.\n * 2. The space character must be encoded as \"%20\" (and not as \"+\").\n * 3. Each URI encoded byte is formed by a '%' and the\n * two-digit uppercase hexadecimal value of the byte. e.g. \"%1A\".\n * 4. Encode the forward slash character, '/', everywhere except\n * in the object key name. For example, if the object key name\n * is photos/Jan/sample.jpg, the forward slash in the key name\n * is not encoded.\n *\n * See https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html\n *\n * @param string the string to encode.\n */\nfunction awsUriEncode(string: string, allowSlashes = false) {\n const bytes: Uint8Array = new TextEncoder().encode(string);\n let encoded = \"\";\n for (const byte of bytes) {\n if (\n (byte >= CODES.A && byte <= CODES.Z) ||\n (byte >= CODES.a && byte <= CODES.z) ||\n (byte >= CODES[\"0\"] && byte <= CODES[\"9\"]) ||\n (ALLOWED_BYTES.includes(byte)) ||\n (byte == CODES[\"/\"] && allowSlashes)\n ) {\n encoded += String.fromCharCode(byte);\n } else {\n encoded += \"%\" + byte.toString(16).padStart(2, \"0\").toUpperCase();\n }\n }\n return encoded;\n}\n\n/**\n * getCanonicalRequest generate a canonical request of style.\n *\n * canonicalRequest =\n * <HTTPMethod>\\n\n * <CanonicalURI>\\n\n * <CanonicalQueryString>\\n\n * <CanonicalHeaders>\\n\n * <SignedHeaders>\\n\n * <HashedPayload>\n */\nfunction getCanonicalRequest(\n method: string,\n path: string,\n headers: Headers,\n headersToSign: string[],\n payloadHash: string,\n): string {\n const headersArray = headersToSign.reduce<string[]>((acc, headerKey) => {\n // Trim spaces from the value (required by V4 spec)\n const val = `${headers.get(headerKey)}`.replace(/ +/g, \" \");\n acc.push(`${headerKey.toLowerCase()}:${val}`);\n return acc;\n }, []);\n\n const requestResource = path.split(\"?\")[0];\n let requestQuery = path.split(\"?\")[1];\n if (requestQuery) {\n requestQuery = requestQuery\n .split(\"&\")\n .map((element) => {\n const [key, val] = element.split(\"=\", 2);\n // The input is assumed to be encoded, so we need to decode it first.\n return awsUriEncode(decodeURIComponent(key)) + \"=\" + awsUriEncode(decodeURIComponent(val || \"\"));\n })\n .sort() // sort after encoding\n .join(\"&\");\n } else {\n requestQuery = \"\";\n }\n\n // construct the canonical string from these parts:\n return [\n method.toUpperCase(),\n awsUriEncode(requestResource, true),\n requestQuery,\n headersArray.join(\"\\n\") + \"\\n\",\n headersToSign.join(\";\").toLowerCase(),\n payloadHash,\n ].join(\"\\n\");\n}\n\n// returns the string that needs to be signed\nasync function getStringToSign(\n canonicalRequest: string,\n requestDate: Date,\n region: string,\n): Promise<string> {\n const hash = await sha256digestHex(canonicalRequest);\n const scope = getScope(region, requestDate);\n return [\n signV4Algorithm,\n makeDateLong(requestDate),\n scope,\n hash,\n ].join(\"\\n\");\n}\n\n/** returns the key used for calculating signature */\nasync function getSigningKey(\n date: Date,\n region: string,\n secretKey: string,\n): Promise<Uint8Array_> {\n const dateLine = makeDateShort(date);\n const hmac1 = await sha256hmac(\"AWS4\" + secretKey, dateLine);\n const hmac2 = await sha256hmac(hmac1, region);\n const hmac3 = await sha256hmac(hmac2, \"s3\");\n return await sha256hmac(hmac3, \"aws4_request\");\n}\n\n/** generate a credential string */\nfunction getCredential(accessKey: string, region: string, requestDate: Date) {\n return `${accessKey}/${getScope(region, requestDate)}`;\n}\n\n/**\n * Given a secret key and some data, generate a HMAC of the data using SHA-256.\n */\nasync function sha256hmac(\n secretKey: Uint8Array_ | string,\n data: Uint8Array_ | string,\n): Promise<Uint8Array_> {\n const enc = new TextEncoder();\n const keyObject = await crypto.subtle.importKey(\n \"raw\", // raw format of the key - should be Uint8Array\n secretKey instanceof Uint8Array ? secretKey : enc.encode(secretKey),\n { name: \"HMAC\", hash: { name: \"SHA-256\" } }, // algorithm\n false, // export = false\n [\"sign\", \"verify\"], // what this key can do\n );\n const signature = await crypto.subtle.sign(\n \"HMAC\",\n keyObject,\n data instanceof Uint8Array ? data : enc.encode(data),\n );\n return new Uint8Array(signature);\n}\n\n/**\n * Type for S3 Post Policy conditions\n * S3 allows conditions to have different shapes\n */\ntype PolicyCondition = Record<string, unknown> | string[];\n\n/**\n * Generate a presigned POST policy that can be used to allow direct uploads to S3.\n * This is equivalent to AWS SDK's presignedPost functionality.\n */\nexport async function presignPostV4(request: {\n host: string;\n protocol: \"http:\" | \"https:\";\n bucket: string;\n objectKey: string;\n accessKey: string;\n secretKey: string;\n region: string;\n date: Date;\n expirySeconds: number;\n conditions?: PolicyCondition[];\n fields?: Record<string, string>;\n}): Promise<{\n url: string;\n fields: Record<string, string>;\n}> {\n if (!request.accessKey) {\n throw new errors.AccessKeyRequiredError();\n }\n if (!request.secretKey) {\n throw new errors.SecretKeyRequiredError();\n }\n if (request.expirySeconds < 1 || request.expirySeconds > 604800) {\n throw new errors.InvalidExpiryError();\n }\n\n const expiration = new Date(request.date);\n expiration.setSeconds(expiration.getSeconds() + request.expirySeconds);\n const credential = getCredential(request.accessKey, request.region, request.date);\n const iso8601Date = makeDateLong(request.date);\n\n // Default required policy fields\n const fields: Record<string, string> = {\n \"X-Amz-Algorithm\": signV4Algorithm,\n \"X-Amz-Credential\": credential,\n \"X-Amz-Date\": iso8601Date,\n \"key\": request.objectKey,\n ...request.fields,\n };\n\n // Build policy document\n const conditions: PolicyCondition[] = [\n { bucket: request.bucket },\n { key: request.objectKey },\n { \"X-Amz-Algorithm\": signV4Algorithm },\n { \"X-Amz-Credential\": credential },\n { \"X-Amz-Date\": iso8601Date },\n ];\n\n // Add any additional conditions provided by the user\n if (request.conditions) {\n conditions.push(...request.conditions);\n }\n\n // Add additional fields as conditions\n for (const [key, value] of Object.entries(request.fields || {})) {\n // Skip fields that we've already added to conditions\n if ([\"key\", \"X-Amz-Algorithm\", \"X-Amz-Credential\", \"X-Amz-Date\"].includes(key)) continue;\n conditions.push({ [key]: value });\n }\n\n const policy = {\n expiration: expiration.toISOString(),\n conditions,\n };\n\n // Convert policy to base64\n const policyBytes = new TextEncoder().encode(JSON.stringify(policy));\n const base64Policy = btoa(String.fromCharCode(...policyBytes));\n fields[\"policy\"] = base64Policy;\n\n // Calculate signature\n const stringToSign = base64Policy;\n const signingKey = await getSigningKey(request.date, request.region, request.secretKey);\n const signature = bin2hex(await sha256hmac(signingKey, stringToSign)).toLowerCase();\n fields[\"X-Amz-Signature\"] = signature;\n\n // Construct the URL\n const url = `${request.protocol}//${request.host}/${request.bucket}`;\n\n return { url, fields };\n}\n\n// Export for testing purposes only\nexport const _internalMethods = {\n awsUriEncode,\n getHeadersToSign,\n getCanonicalRequest,\n getStringToSign,\n getSigningKey,\n getCredential,\n sha256hmac,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;ACAA;;;;ACAA;;;;ACAA;;AAIO,IAAM,sBAAN,cAAkC,gBAAA;EAJzC,OAIyC;;;;EACvC,YAA6B,cAAsB;AAGjD,QAAI,SAAS,IAAI,WAAW,YAAA;AAC5B,QAAI,SAAS;AAEb,UAAM;MACJ,UAAU,OAAO,YAAU;AACzB,YAAI,MAAM;AACV,eAAO,MAAM,MAAM,QAAQ;AAEzB,gBAAM,SAAS,eAAe;AAE9B,gBAAM,SAAS,KAAK,IAAI,QAAQ,MAAM,SAAS,GAAA;AAG/C,iBAAO,IAAI,MAAM,SAAS,KAAK,MAAM,MAAA,GAAS,MAAA;AAC9C,iBAAO;AACP,oBAAU;AAGV,cAAI,WAAW,cAAc;AAC3B,uBAAW,QAAQ,MAAA;AAEnB,qBAAS,IAAI,WAAW,YAAA;AACxB,qBAAS;UACX;QACF;MACF;MACA,MAAM,YAAU;AAEd,YAAI,SAAS,GAAG;AACd,qBAAW,QAAQ,OAAO,SAAS,GAAG,MAAA,CAAA;QACxC;MACF;IACF,CAAA,GAAA,KAnC2B,eAAA;EAoC7B;AACF;;;AC1CA;;;;ACAA;;AAyBO,SAAS,MAAM,KAAW;AAC/B,QAAM,IAAI,KAAI;AAGd,QAAM,IAAI,QAAQ,oBAAoB,EAAA;AAEtC,SAAO,SAAA;AAKP,WAAS,WAAA;AACP,WAAO;MACL,aAAa,YAAA;MACb,MAAM,IAAA;IACR;EACF;AALS;AAUT,WAAS,cAAA;AACP,UAAM,IAAI,MAAM,YAAA;AAChB,QAAI,CAAC,EAAG;AAIR,UAAM,OAAY;MAChB,YAAY,CAAC;IACf;AAGA,WAAO,EAAE,IAAA,KAAS,GAAG,IAAA,IAAQ;AAC3B,YAAM,OAAO,UAAA;AACb,UAAI,CAAC,KAAM,QAAO;AAClB,WAAK,WAAW,KAAK,IAAI,IAAI,KAAK;IACpC;AAEA,UAAM,QAAA;AAEN,WAAO;EACT;AApBS;AAyBT,WAAS,MAAA;AACP,UAAM,IAAI,MAAM,iBAAA;AAChB,QAAI,CAAC,EAAG;AAGR,UAAM,OAAY;MAChB,MAAM,EAAE,CAAA;MACR,YAAY,CAAC;MACb,UAAU,CAAA;IACZ;AAGA,WAAO,EAAE,IAAA,KAAS,GAAG,GAAA,KAAQ,GAAG,IAAA,KAAS,GAAG,IAAA,IAAQ;AAClD,YAAM,OAAO,UAAA;AACb,UAAI,CAAC,KAAM,QAAO;AAClB,WAAK,WAAW,KAAK,IAAI,IAAI,KAAK;IACpC;AAGA,QAAI,MAAM,YAAA,GAAe;AACvB,aAAO;IACT;AAEA,UAAM,SAAA;AAGN,SAAK,UAAU,QAAA;AAGf,QAAI;AACJ,WAAQ,QAAQ,IAAA,GAAQ;AACtB,WAAK,SAAS,KAAK,KAAA;IACrB;AAGA,UAAM,kBAAA;AAEN,WAAO;EACT;AAtCS;AA2CT,WAAS,UAAA;AACP,UAAM,IAAI,MAAM,UAAA;AAChB,QAAI,EAAG,QAAO,SAAS,EAAE,CAAA,CAAE;AAC3B,WAAO;EACT;AAJS;AAST,WAAS,YAAA;AACP,UAAM,IAAI,MAAM,0CAAA;AAChB,QAAI,CAAC,EAAG;AACR,WAAO;MAAE,MAAM,EAAE,CAAA;MAAI,OAAO,SAAS,MAAM,EAAE,CAAA,CAAE,CAAA;IAAG;EACpD;AAJS;AAST,WAAS,MAAM,KAAW;AACxB,WAAO,IAAI,QAAQ,gBAAgB,EAAA;EACrC;AAFS;AAKT,WAAS,SAAS,KAAW;AAC3B,WAAO,IAAI,WAAW,QAAQ,GAAA,EAAK,WAAW,QAAQ,GAAA,EAAK,WAAW,SAAS,GAAA;EACjF;AAFS;AAOT,WAAS,MAAM,IAAU;AACvB,UAAM,IAAI,IAAI,MAAM,EAAA;AACpB,QAAI,CAAC,EAAG;AACR,UAAM,IAAI,MAAM,EAAE,CAAA,EAAG,MAAM;AAC3B,WAAO;EACT;AALS;AAUT,WAAS,MAAA;AACP,WAAO,IAAI,WAAW;EACxB;AAFS;AAOT,WAAS,GAAG,QAAc;AACxB,WAAO,IAAI,WAAW,MAAA;EACxB;AAFS;AAGX;AA3IgB;;;ADdT,IAAM,UAAN,cAAsB,MAAA;EAX7B,OAW6B;;;AAAO;AAS7B,IAAM,uBAAN,cAAmC,QAAA;EApB1C,OAoB0C;;;AAAS;AAM5C,IAAM,uBAAN,cAAmC,QAAA;EA1B1C,OA0B0C;;;AAAS;AAO5C,IAAM,yBAAN,cAAqC,QAAA;EAjC5C,OAiC4C;;;;EAC1C,YAA4B,YAAoB;AAC9C,UAAM,wBAAwB,UAAA,EAAY,GAAA,KADhB,aAAA;EAE5B;AACF;AAOO,IAAM,yBAAN,cAAqC,QAAA;EA5C5C,OA4C4C;;;;EAC1C,YAA4B,YAAoB;AAC9C,UAAM,wBAAwB,UAAA,EAAY,GAAA,KADhB,aAAA;EAE5B;AACF;AAGO,IAAM,yBAAN,cAAqC,QAAA;EAnD5C,OAmD4C;;;EAC1C,cAAc;AACZ,UAAM,uBAAA;EACR;AACF;AAGO,IAAM,yBAAN,cAAqC,QAAA;EA1D5C,OA0D4C;;;EAC1C,cAAc;AACZ,UAAM,uBAAA;EACR;AACF;AAGO,IAAM,qBAAN,cAAiC,QAAA;EAjExC,OAiEwC;;;EACtC,cAAc;AACZ,UAAM,gEAAA;EACR;AACF;AAGO,IAAM,cAAN,cAA0B,QAAA;EAxEjC,OAwEiC;;;;;EACtB;EACA;EACA;EACA;EAET,YACkB,YACA,MAChB,SACA,YAAuF,CAAC,GACxF;AACA,UAAM,OAAA,GAAA,KALU,aAAA,YAAA,KACA,OAAA;AAKhB,SAAK,MAAM,UAAU;AACrB,SAAK,aAAa,UAAU;AAC5B,SAAK,WAAW,UAAU;AAC1B,SAAK,SAAS,UAAU;EAC1B;AACF;AAGA,eAAsB,iBAAiB,UAAkB;AACvD,MAAI;AACF,UAAM,YAAY,MAAS,MAAM,SAAS,KAAI,CAAA;AAC9C,UAAM,YAAY,UAAU;AAC5B,QAAI,WAAW,SAAS,SAAS;AAC/B,YAAM,IAAI,MAAM,gCAAA;IAClB;AACA,UAAM,OAAO,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAA,GAAS,WAAW;AAC3E,UAAM,UAAU,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,SAAA,GAAY,WACpE;AACF,UAAM,MAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,KAAA,GAAQ;AAC9D,UAAM,aAAa,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,YAAA,GAAe;AAC5E,UAAM,WAAW,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,UAAA,GAAa;AACxE,UAAM,SAAS,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAA,GAAW;AACpE,WAAO,IAAI,YAAY,SAAS,QAAQ,MAAM,SAAS;MAAE;MAAK;MAAY;MAAU;IAAO,CAAA;EAC7F,QAAQ;AACN,WAAO,IAAI,YACT,SAAS,QACT,qBACA,mCAAmC,SAAS,MAAM,IAAI,SAAS,UAAU,oCAAoC;EAEjH;AACF;AAtBsB;;;AE7FtB;;AAQO,SAAS,YAAY,MAAY;AAEtC,MAAI,OAAO,SAAS,YAAY,MAAM,IAAA,GAAO;AAC3C,WAAO;EACT;AAEA,SAAO,QAAQ,KAAK,QAAQ;AAC9B;AAPgB;AAiBT,SAAS,kBAAkB,QAAc;AAC9C,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;EACT;AAIA,MAAI,OAAO,SAAS,KAAK;AACvB,WAAO;EACT;AAEA,MAAI,OAAO,SAAS,IAAA,GAAO;AACzB,WAAO;EACT;AAMA,SAAO,QAAQ,OAAO,MAAM,wCAAA,CAAA;AAC9B;AApBgB;AA0BT,SAAS,kBAAkB,YAAkB;AAClD,MAAI,CAAC,cAAc,UAAA,EAAa,QAAO;AACvC,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO;AACT;AAJgB;AAOT,SAAS,cAAc,QAAc;AAC1C,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,OAAO,SAAS,KAAM,QAAO;AACjC,SAAO;AACT;AAJgB;AAST,SAAS,QAAQ,QAAkB;AACxC,SAAO,MAAM,KAAK,MAAA,EAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,EAAA,EAAI,SAAS,GAAG,GAAA,CAAA,EAAM,KACpE,EAAA;AAEJ;AAJgB;AAMT,SAAS,aAAa,OAAO,IAAE;AACpC,QAAM,eAAuC;IAC3C,KAAK;IACL,UAAU;IACV,SAAS;IACT,UAAU;IACV,YAAY;EACd;AACA,SAAO,KAAK,QACV,wCACA,CAAC,MAAM,aAAa,CAAA,CAAE;AAE1B;AAZgB;AAcT,SAAS,aAAa,SAAgB;AAC3C,SAAO,QAAQ,IAAI,kBAAA,KAAuB;AAC5C;AAFgB;AAKT,SAAS,aAAa,MAAU;AAErC,QAAM,UAAU,KAAK,YAAW;AAEhC,SAAO,QAAQ,MAAM,GAAG,CAAA,IACtB,QAAQ,MAAM,GAAG,CAAA,IACjB,QAAQ,MAAM,GAAG,EAAA,IACjB,QAAQ,MAAM,IAAI,EAAA,IAClB,QAAQ,MAAM,IAAI,EAAA,IAAM;AAC5B;AATgB;AAYT,SAAS,cAAc,MAAU;AACtC,SAAO,aAAa,IAAA,EAAM,MAAM,GAAG,CAAA;AACrC;AAFgB;AAIT,SAAS,SAAS,QAAgB,MAAU;AACjD,SAAO,GAAG,cAAc,IAAA,CAAA,IAAS,MAAA;AACnC;AAFgB;AAIhB,eAAsB,gBAAgB,MAA0B;AAC9D,MAAI,EAAE,gBAAgB,aAAa;AACjC,WAAO,IAAI,YAAA,EAAc,OAAO,IAAA;EAClC;AACA,SAAO,QAAQ,IAAI,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,IAAA,CAAA,CAAA;AACtE;AALsB;;;AC/GtB;;AAIA,IAAM,gCAAgC;EACpC;EACA;EACA;;AAeK,IAAM,iBAAN,cAA6B,eAAA;EAtBpC,OAsBoC;;;EAClB;EAEhB,YAAY,EAAE,QAAQ,YAAY,YAAY,UAAU,SAAQ,GAM7D;AACD,QAAI;AACJ,QAAI,iBAAiB;AACrB,QAAI;AACJ,UAAM,QAA0C,CAAA;AAEhD,QAAI;AAEJ,UAAM,gBAA4C,CAAA;AAElD,UAAM;MACJ,QAAA;MAAS;MACT,MAAM,MAAM,OAAO,aAAW;AAC5B,cAAM,SAAS;AACf,cAAM,aAAa;AAEnB,YAAI;AAEF,cAAI,cAAc,KAAK,MAAM,SAAS,UAAU;AAE9C,kBAAM,WAAW,MAAM,OAAO,YAAY;cACxC;cACA,SAAS,IAAI,QAAQ;;gBAEnB,GAAG;gBACH,kBAAkB,OAAO,MAAM,MAAM;cACvC,CAAA;cACA;cACA;cACA,SAAS;YACX,CAAA;AACA,qBAAS;cACP,MAAM,aAAa,SAAS,QAAQ,IAAI,MAAA,KAAW,MAAA;cACnD,WAAW,aAAa,SAAS,OAAO;YAC1C;AACA;UACF;AAGA,cAAI,eAAe,GAAG;AACpB,wBAAY,MAAM,2BAA2B;cAC3C;cACA;cACA;cACA;YACF,CAAA,GAAI;UACN;AAEA,gBAAM,cAAsC;YAC1C,kBAAkB,OAAO,MAAM,MAAM;UACvC;AACA,qBAAW,OAAO,+BAA+B;AAC/C,kBAAM,QAAQ,SAAS,GAAA;AACvB,gBAAI,OAAO;AACT,0BAAY,GAAA,IAAO;YACrB;UACF;AACA,gBAAM,cAAc,OAAO,YAAY;YACrC;YACA,OAAO;cAAE,YAAY,WAAW,SAAQ;cAAI;YAAS;YACrD,SAAS,IAAI,QAAQ,WAAA;YACrB;YACA;YACA,SAAS;UACX,CAAA,EAAG,KAAK,CAAC,aAAA;AAEP,gBAAI,OAAO,SAAS,QAAQ,IAAI,MAAA,KAAW;AAC3C,gBAAI,MAAM;AACR,qBAAO,KAAK,QAAQ,MAAM,EAAA,EAAI,QAAQ,MAAM,EAAA;YAC9C;AACA,kBAAM,KAAK;cAAE,MAAM;cAAY;YAAK,CAAA;AACpC,mBAAO;UACT,CAAA;AAMA,wBAAc,KAAK,YAAY,MAAM,CAAC,QAAA;AAEpC,gBAAI,CAAC,kBAAkB;AACrB,iCAAmB;YACrB;UACF,CAAA,CAAA;QACF,SAAS,KAAK;AAEZ,gBAAM;QACR;MACF;MACA,MAAM,QAAA;AACJ,YAAI,QAAQ;QAEZ,WAAW,UAAU;AAEnB,gBAAM,QAAQ,IAAI,aAAA;AAClB,cAAI,kBAAkB;AAEpB,kBAAM;UACR;AAEA,gBAAM,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,EAAC;AAE5C,mBAAS,MAAM,wBAAwB;YAAE;YAAQ;YAAY;YAAY;YAAU;UAAM,CAAA;QAC3F,OAAO;AACL,gBAAM,IAAI,MAAM,+CAAA;QAClB;MACF;IACF,CAAA;AACA,SAAK,YAAY,MAAA;AACf,UAAI,WAAW,QAAW;AACxB,cAAM,IAAI,MAAM,8CAAA;MAClB;AACA,aAAO;IACT;EACF;AACF;AAGA,eAAe,2BACb,SAKC;AAED,QAAM,SAAS;AACf,QAAM,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AAC5C,QAAM,QAAQ;AACd,QAAM,WAAW,MAAM,QAAQ,OAAO,YAAY;IAChD;IACA,YAAY,QAAQ;IACpB,YAAY,QAAQ;IACpB;IACA;IACA,YAAY;EACd,CAAA;AAOA,QAAM,eAAe,MAAM,SAAS,KAAI;AACxC,QAAM,OAAO,MAAS,YAAA,EAAc;AACpC,MAAI,CAAC,QAAQ,KAAK,SAAS,iCAAiC;AAC1D,UAAM,IAAI,MAAM,wBAAwB,YAAA,EAAc;EACxD;AACA,QAAM,WAAW,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,UAAA,GAAa;AACnE,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,yCAAyC,YAAA,EAAc;EACzE;AACA,SAAO;IAAE;EAAS;AACpB;AAnCe;AAqCf,eAAe,wBACb,EAAE,QAAQ,YAAY,YAAY,UAAU,MAAK,GAMhD;AAED,QAAM,UAAU;;UAER,MAAM,IAAI,CAAC,OAAO,uBAAuB,GAAG,IAAI,sBAAsB,GAAG,IAAI,gBAAgB,EAAE,KAAK,IAAA,CAAA;;;AAG5G,QAAM,WAAW,MAAM,OAAO,YAAY;IACxC,QAAQ;IACR;IACA;IACA,OAAO,YAAY,mBAAmB,QAAA,CAAA;IACtC,SAAS,IAAI,YAAA,EAAc,OAAO,OAAA;IAClC,YAAY;EACd,CAAA;AACA,QAAM,eAAe,MAAM,SAAS,KAAI;AASxC,QAAM,OAAO,MAAS,YAAA,EAAc;AACpC,MAAI,CAAC,QAAQ,KAAK,SAAS,iCAAiC;AAC1D,UAAM,IAAI,MAAM,wBAAwB,YAAA,EAAc;EACxD;AACA,QAAM,UAAU,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAA,GAAS;AAC9D,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,qCAAqC,YAAA,EAAc;AACjF,QAAM,YAAY,aAAa,SAAS,OAAO;AAC/C,SAAO;IACL,MAAM,aAAa,OAAA;IACnB;EACF;AACF;AA1Ce;;;AC3Lf;;AAGA,IAAM,kBAAkB;AAKxB,eAAsB,OAAO,SAQ5B;AACC,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAW,uBAAsB;EACzC;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAW,uBAAsB;EACzC;AAEA,QAAM,YAAY,QAAQ,QAAQ,IAAI,sBAAA;AACtC,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI,MACR,oFAAA;EAEJ;AAEA,QAAM,gBAAgB,iBAAiB,QAAQ,OAAO;AACtD,QAAM,mBAAmB,oBACvB,QAAQ,QACR,QAAQ,MACR,QAAQ,SACR,eACA,SAAA;AAEF,QAAM,eAAe,MAAM,gBACzB,kBACA,QAAQ,MACR,QAAQ,MAAM;AAEhB,QAAM,aAAa,MAAM,cACvB,QAAQ,MACR,QAAQ,QACR,QAAQ,SAAS;AAEnB,QAAM,aAAa,cACjB,QAAQ,WACR,QAAQ,QACR,QAAQ,IAAI;AAEd,QAAM,YAAY,QAAQ,MAAM,WAAW,YAAY,YAAA,CAAA,EACpD,YAAW;AAEd,SAAO,GAAG,eAAA,eAA8B,UAAA,mBACtC,cAAc,KAAK,GAAA,EAAK,YAAW,CAAA,eACtB,SAAA;AACjB;AApDsB;AAyDtB,eAAsB,UAAU,SAW/B;AACC,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAW,uBAAsB;EACzC;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAW,uBAAsB;EACzC;AACA,MAAI,QAAQ,gBAAgB,KAAK,QAAQ,gBAAgB,QAAQ;AAC/D,UAAM,IAAW,mBAAkB;EACrC;AACA,MAAI,CAAC,QAAQ,QAAQ,IAAI,MAAA,GAAS;AAChC,UAAM,IAAI,MAAM,qCAAA;EAClB;AAGA,QAAM,WAAW,QAAQ,KAAK,MAAM,GAAA,EAAK,CAAA;AACzC,QAAM,cAAc,QAAQ,KAAK,MAAM,GAAA,EAAK,CAAA;AAC5C,QAAM,cAAc,aAAa,QAAQ,IAAI;AAC7C,QAAM,gBAAgB,iBAAiB,QAAQ,OAAO;AACtD,QAAM,aAAa,cAAc,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,IAAI;AAChF,QAAM,gBAAgB;AAGtB,QAAM,WAAW,IAAI,gBAAgB,WAAA;AACrC,WAAS,IAAI,mBAAmB,eAAA;AAChC,WAAS,IAAI,oBAAoB,UAAA;AACjC,WAAS,IAAI,cAAc,WAAA;AAC3B,WAAS,IAAI,iBAAiB,QAAQ,cAAc,SAAQ,CAAA;AAC5D,WAAS,IAAI,uBAAuB,cAAc,KAAK,GAAA,EAAK,YAAW,CAAA;AACvE,MAAI,QAAQ,cAAc;AACxB,aAAS,IAAI,wBAAwB,QAAQ,YAAY;EAC3D;AACA,QAAM,iBAAiB,SAAS,SAAQ,EAAG,QAAQ,KAAK,KAAA;AACxD,QAAM,cAAc,WAAW,MAAM;AACrC,QAAM,cAAc,SAAS,MAAM,GAAA,EAAK,IAAI,CAAC,SAAS,mBAAmB,IAAA,CAAA,EAAO,KAAK,GAAA;AAErF,QAAM,mBAAmB,oBACvB,QAAQ,QACR,aACA,QAAQ,SACR,eACA,aAAA;AAEF,QAAM,eAAe,MAAM,gBAAgB,kBAAkB,QAAQ,MAAM,QAAQ,MAAM;AACzF,QAAM,aAAa,MAAM,cAAc,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,SAAS;AACtF,QAAM,YAAY,QAAQ,MAAM,WAAW,YAAY,YAAA,CAAA,EAAe,YAAW;AAEjF,QAAM,eAAe,GAAG,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,IAAI,MAAA,CAAA,GAAU,WAAA,IAAe,cAAA,oBAAkC,SAAA;AAC5H,SAAO;AACT;AA5DsB;AAkEtB,SAAS,iBAAiB,SAAgB;AA4BxC,QAAM,iBAAiB;IACrB;IACA;IACA;IACA;;AAEF,QAAM,gBAAgB,CAAA;AACtB,aAAW,OAAO,QAAQ,KAAI,GAAI;AAChC,QAAI,eAAe,SAAS,IAAI,YAAW,CAAA,GAAK;AAC9C;IACF;AACA,kBAAc,KAAK,GAAA;EACrB;AACA,gBAAc,KAAI;AAClB,SAAO;AACT;AA3CS;AA6CT,IAAM,QAAQ;EACZ,GAAG,IAAI,WAAW,CAAA;EAClB,GAAG,IAAI,WAAW,CAAA;EAClB,GAAG,IAAI,WAAW,CAAA;EAClB,GAAG,IAAI,WAAW,CAAA;EAClB,KAAK,IAAI,WAAW,CAAA;EACpB,KAAK,IAAI,WAAW,CAAA;EACpB,KAAK,IAAI,WAAW,CAAA;AACtB;AACA,IAAM,gBAAgB,OAAO,MAAM,EAAA,EAAI,IAAI,CAAC,MAAM,EAAE,WAAW,CAAA,CAAA;AAkB/D,SAAS,aAAa,QAAgB,eAAe,OAAK;AACxD,QAAM,QAAoB,IAAI,YAAA,EAAc,OAAO,MAAA;AACnD,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,QACG,QAAQ,MAAM,KAAK,QAAQ,MAAM,KACjC,QAAQ,MAAM,KAAK,QAAQ,MAAM,KACjC,QAAQ,MAAM,GAAA,KAAQ,QAAQ,MAAM,GAAA,KACpC,cAAc,SAAS,IAAA,KACvB,QAAQ,MAAM,GAAA,KAAQ,cACvB;AACA,iBAAW,OAAO,aAAa,IAAA;IACjC,OAAO;AACL,iBAAW,MAAM,KAAK,SAAS,EAAA,EAAI,SAAS,GAAG,GAAA,EAAK,YAAW;IACjE;EACF;AACA,SAAO;AACT;AAjBS;AA8BT,SAAS,oBACP,QACA,MACA,SACA,eACA,aAAmB;AAEnB,QAAM,eAAe,cAAc,OAAiB,CAAC,KAAK,cAAA;AAExD,UAAM,MAAM,GAAG,QAAQ,IAAI,SAAA,CAAA,GAAa,QAAQ,OAAO,GAAA;AACvD,QAAI,KAAK,GAAG,UAAU,YAAW,CAAA,IAAM,GAAA,EAAK;AAC5C,WAAO;EACT,GAAG,CAAA,CAAE;AAEL,QAAM,kBAAkB,KAAK,MAAM,GAAA,EAAK,CAAA;AACxC,MAAI,eAAe,KAAK,MAAM,GAAA,EAAK,CAAA;AACnC,MAAI,cAAc;AAChB,mBAAe,aACZ,MAAM,GAAA,EACN,IAAI,CAAC,YAAA;AACJ,YAAM,CAAC,KAAK,GAAA,IAAO,QAAQ,MAAM,KAAK,CAAA;AAEtC,aAAO,aAAa,mBAAmB,GAAA,CAAA,IAAQ,MAAM,aAAa,mBAAmB,OAAO,EAAA,CAAA;IAC9F,CAAA,EACC,KAAI,EACJ,KAAK,GAAA;EACV,OAAO;AACL,mBAAe;EACjB;AAGA,SAAO;IACL,OAAO,YAAW;IAClB,aAAa,iBAAiB,IAAA;IAC9B;IACA,aAAa,KAAK,IAAA,IAAQ;IAC1B,cAAc,KAAK,GAAA,EAAK,YAAW;IACnC;IACA,KAAK,IAAA;AACT;AAvCS;AA0CT,eAAe,gBACb,kBACA,aACA,QAAc;AAEd,QAAM,OAAO,MAAM,gBAAgB,gBAAA;AACnC,QAAM,QAAQ,SAAS,QAAQ,WAAA;AAC/B,SAAO;IACL;IACA,aAAa,WAAA;IACb;IACA;IACA,KAAK,IAAA;AACT;AAbe;AAgBf,eAAe,cACb,MACA,QACA,WAAiB;AAEjB,QAAM,WAAW,cAAc,IAAA;AAC/B,QAAM,QAAQ,MAAM,WAAW,SAAS,WAAW,QAAA;AACnD,QAAM,QAAQ,MAAM,WAAW,OAAO,MAAA;AACtC,QAAM,QAAQ,MAAM,WAAW,OAAO,IAAA;AACtC,SAAO,MAAM,WAAW,OAAO,cAAA;AACjC;AAVe;AAaf,SAAS,cAAc,WAAmB,QAAgB,aAAiB;AACzE,SAAO,GAAG,SAAA,IAAa,SAAS,QAAQ,WAAA,CAAA;AAC1C;AAFS;AAOT,eAAe,WACb,WACA,MAA0B;AAE1B,QAAM,MAAM,IAAI,YAAA;AAChB,QAAM,YAAY,MAAM,OAAO,OAAO,UACpC,OACA,qBAAqB,aAAa,YAAY,IAAI,OAAO,SAAA,GACzD;IAAE,MAAM;IAAQ,MAAM;MAAE,MAAM;IAAU;EAAE,GAC1C,OACA;IAAC;IAAQ;GAAS;AAEpB,QAAM,YAAY,MAAM,OAAO,OAAO,KACpC,QACA,WACA,gBAAgB,aAAa,OAAO,IAAI,OAAO,IAAA,CAAA;AAEjD,SAAO,IAAI,WAAW,SAAA;AACxB;AAlBe;AA8Bf,eAAsB,cAAc,SAYnC;AAIC,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAW,uBAAsB;EACzC;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAW,uBAAsB;EACzC;AACA,MAAI,QAAQ,gBAAgB,KAAK,QAAQ,gBAAgB,QAAQ;AAC/D,UAAM,IAAW,mBAAkB;EACrC;AAEA,QAAM,aAAa,IAAI,KAAK,QAAQ,IAAI;AACxC,aAAW,WAAW,WAAW,WAAU,IAAK,QAAQ,aAAa;AACrE,QAAM,aAAa,cAAc,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,IAAI;AAChF,QAAM,cAAc,aAAa,QAAQ,IAAI;AAG7C,QAAM,SAAiC;IACrC,mBAAmB;IACnB,oBAAoB;IACpB,cAAc;IACd,OAAO,QAAQ;IACf,GAAG,QAAQ;EACb;AAGA,QAAM,aAAgC;IACpC;MAAE,QAAQ,QAAQ;IAAO;IACzB;MAAE,KAAK,QAAQ;IAAU;IACzB;MAAE,mBAAmB;IAAgB;IACrC;MAAE,oBAAoB;IAAW;IACjC;MAAE,cAAc;IAAY;;AAI9B,MAAI,QAAQ,YAAY;AACtB,eAAW,KAAI,GAAI,QAAQ,UAAU;EACvC;AAGA,aAAW,CAAC,KAAK,KAAA,KAAU,OAAO,QAAQ,QAAQ,UAAU,CAAC,CAAA,GAAI;AAE/D,QAAI;MAAC;MAAO;MAAmB;MAAoB;MAAc,SAAS,GAAA,EAAM;AAChF,eAAW,KAAK;MAAE,CAAC,GAAA,GAAM;IAAM,CAAA;EACjC;AAEA,QAAM,SAAS;IACb,YAAY,WAAW,YAAW;IAClC;EACF;AAGA,QAAM,cAAc,IAAI,YAAA,EAAc,OAAO,KAAK,UAAU,MAAA,CAAA;AAC5D,QAAM,eAAe,KAAK,OAAO,aAAY,GAAI,WAAA,CAAA;AACjD,SAAO,QAAA,IAAY;AAGnB,QAAM,eAAe;AACrB,QAAM,aAAa,MAAM,cAAc,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,SAAS;AACtF,QAAM,YAAY,QAAQ,MAAM,WAAW,YAAY,YAAA,CAAA,EAAe,YAAW;AACjF,SAAO,iBAAA,IAAqB;AAG5B,QAAM,MAAM,GAAG,QAAQ,QAAQ,KAAK,QAAQ,IAAI,IAAI,QAAQ,MAAM;AAElE,SAAO;IAAE;IAAK;EAAO;AACvB;AAjFsB;;;AN/RtB,IAAM,eAAe;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AA0EF,IAAM,kBAAkB,IAAI,OAAO;AAEnC,IAAM,kBAAkB,IAAI,OAAO,OAAO;AAE1C,IAAM,gBAAgB,IAAI,OAAO,OAAO,OAAO;AAwBxC,IAAM,SAAN,MAAM;EAtLb,OAsLa;;;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAAY;;EAEZ;EACA;EAET,YAAY,EAAE,UAAU,QAAQ,MAAM,YAAY,GAAG,OAAA,GAAmC;AAEtF,QAAI,gBAAgB,KAAK,QAAA,GAAW;AAClC,UAAI,WAAW,UAAa,SAAS,UAAa,eAAe,QAAW;AAC1E,cAAM,IAAW,qBAAqB,kEAAkE;MAC1G;AACA,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,QAAA;AACpB,mBAAW,IAAI;AACf,iBAAS,IAAI,aAAa;AAC1B,eAAO,IAAI,OAAO,SAAS,IAAI,MAAM,EAAA,IAAO,SAAS,MAAM;AAC3D,YAAI,IAAI,YAAY,IAAI,aAAa,KAAK;AACxC,uBAAa,IAAI,SAAS,SAAS,GAAA,IAAO,IAAI,SAAS,MAAM,GAAG,EAAC,IAAK,IAAI;QAC5E;MACF,QAAQ;AACN,cAAM,IAAW,qBAAqB,yBAAyB,QAAA,EAAU;MAC3E;IACF;AAGA,QAAI,OAAO,aAAa,YAAY,SAAS,WAAW,GAAG;AACzD,YAAM,IAAW,qBAAqB,qBAAqB,QAAA,EAAU;IACvE;AAGA,QAAI,WAAW,QAAW;AACxB,eAAS;IACX;AAGA,QAAI,SAAS,UAAa,CAAC,YAAY,IAAA,GAAO;AAC5C,YAAM,IAAW,qBAAqB,iBAAiB,IAAA,EAAM;IAC/D;AAGA,QAAI,OAAO,aAAa,CAAC,OAAO,WAAW;AACzC,YAAM,IAAW,qBAAqB,6DAA6D;IACrG;AACA,QAAI,OAAO,aAAa,OAAO,UAAU,WAAW,MAAA,KAAW,CAAC,OAAO,cAAc;AACnF,YAAM,IAAW,qBAAqB,0EAA0E;IAClH;AAEA,UAAM,cAAc,SAAS,MAAM;AACnC,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,SAAS,YAAW,KAAM,KAAK,SAAS,cAAc,IAAI,KAAK,IAAI,KAAK;AACpF,SAAK,WAAW,SAAS,WAAW;AACpC,SAAK,YAAY,OAAO;AACxB,SAAK,aAAa,OAAO,aAAa;AACtC,SAAK,eAAe,OAAO;AAC3B,SAAK,YAAY,OAAO,aAAa;AACrC,SAAK,aAAa,cAAc;AAChC,SAAK,gBAAgB,OAAO;AAC5B,SAAK,SAAS,OAAO;AAErB,QAAI,KAAK,YAAY;AACnB,UAAI,CAAC,KAAK,WAAW;AACnB,cAAM,IAAW,qBAAqB,iDAAiD;MACzF;AACA,UAAI,CAAC,KAAK,WAAW,WAAW,GAAA,GAAM;AACpC,cAAM,IAAW,qBAAqB,gCAAgC;MACxE;AACA,UAAI,KAAK,WAAW,SAAS,GAAA,GAAM;AACjC,cAAM,IAAW,qBAAqB,kCAAkC;MAC1E;IACF;EACF;;EAGU,cAAc,SAAsD;AAC5E,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,QAAI,eAAe,UAAa,CAAC,kBAAkB,UAAA,GAAa;AAC9D,YAAM,IAAW,uBAAuB,cAAc,EAAA;IACxD;AACA,WAAO;EACT;;;;EAKQ,oBAAoB,SAU1B;AACA,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,UAAM,OAAO,KAAK,YAAY,KAAK,OAAO,GAAG,UAAA,IAAc,KAAK,IAAI;AACpE,UAAM,UAAU,QAAQ,WAAW,IAAI,QAAA;AACvC,YAAQ,IAAI,QAAQ,IAAA;AACpB,UAAM,gBAAgB,OAAO,QAAQ,UAAU,WAC3C,IAAI,gBAAgB,QAAQ,KAAK,EAAE,SAAQ,EAAG,QAAQ,KAAK,KAAA,IAC1D,QAAQ;AAEb,UAAM,WAAW,KAAK,YAClB,GAAG,KAAK,UAAU,IAAI,UAAA,IAAc,QAAQ,UAAU,KACtD,IAAI,QAAQ,UAAU;AAC1B,UAAM,cAAc,gBAAgB,IAAI,aAAA,KAAkB;AAC1D,UAAM,OAAO,WAAW;AAGxB,UAAM,cAAc,SAAS,MAAM,GAAA,EAAK,IAAI,CAAC,SAAS,mBAAmB,IAAA,CAAA,EAAO,KAAK,GAAA,IAAO;AAC5F,WAAO;MAAE;MAAS;MAAM;MAAM;IAAY;EAC5C;;;;EAKA,MAAa,YAAY,EAAE,QAAQ,SAAS,GAAG,QAAA,GAiBzB;AACpB,UAAM,OAAO,oBAAI,KAAA;AACjB,UAAM,EAAE,SAAS,MAAM,MAAM,YAAW,IAAK,KAAK,oBAAoB,OAAA;AACtE,UAAM,aAAa,QAAQ,cAAc;AAEzC,QACE,WAAW,UAAU,WAAW,SAAS,WAAW,UACpD;AACA,UAAI,YAAY,QAAW;AACzB,kBAAU,IAAI,WAAA;MAChB,WAAW,OAAO,YAAY,UAAU;AACtC,kBAAU,IAAI,YAAA,EAAc,OAAO,OAAA;MACrC;AACA,cAAQ,IAAI,kBAAkB,OAAO,QAAQ,MAAM,CAAA;IACrD,WAAW,SAAS;AAClB,YAAM,IAAI,MAAM,yBAAyB,MAAA,WAAiB;IAC5D;AACA,UAAM,YAAY,MAAM,gBAAgB,WAAW,IAAI,WAAA,CAAA;AACvD,YAAQ,IAAI,cAAc,aAAa,IAAA,CAAA;AACvC,YAAQ,IAAI,wBAAwB,SAAA;AACpC,QAAI,KAAK,WAAW;AAClB,UAAI,KAAK,cAAc;AACrB,gBAAQ,IAAI,wBAAwB,KAAK,YAAY;MACvD;AACA,cAAQ,IACN,iBACA,MAAM,OAAO;QACX;QACA;QACA;QACA,WAAW,KAAK;QAChB,WAAW,KAAK;QAChB,QAAQ,KAAK;QACb;MACF,CAAA,CAAA;IAEJ;AAEA,UAAM,UAAU,GAAG,KAAK,QAAQ,KAAK,IAAA,GAAO,WAAA;AAE5C,UAAM,WAAW,MAAM,MAAM,SAAS;MACpC;MACA;MACA,MAAM;IACR,CAAA;AAEA,QAAI,SAAS,WAAW,YAAY;AAClC,UAAI,SAAS,UAAU,KAAK;AAC1B,cAAM,QAAQ,MAAa,iBAAiB,QAAA;AAC5C,cAAM;MACR,WAAW,SAAS,WAAW,KAAK;AAElC,cAAM,IAAW,YACf,SAAS,QACT,sBACA,kMAC4F;MAEhG;AACA,YAAM,IAAW,YACf,SAAS,QACT,wBACA,sDAAsD,UAAA,SAAmB,SAAS,MAAM,IAAI,SAAS,UAAU,IAAI;IAEvH;AACA,QAAI,CAAC,QAAQ,YAAY;AAEvB,YAAM,SAAS,MAAM,UAAA,EAAY,KAAA;IACnC;AACA,WAAO;EACT;;;;;;EAOA,MAAM,aACJ,YACA,UAAmF,CAAC,GACpF;AACA,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,QAAI,CAAC,kBAAkB,UAAA,GAAa;AAClC,YAAM,IAAW,uBAAuB,UAAA;IAC1C;AAEA,UAAM,QAAgC,QAAQ,YAAY;MAAE,WAAW,QAAQ;IAAU,IAAI,CAAC;AAC9F,UAAM,UAAU,IAAI,QAAA;AACpB,QAAI,QAAQ,kBAAkB;AAC5B,cAAQ,IAAI,qCAAqC,MAAA;IACnD;AAEA,UAAM,KAAK,YAAY;MACrB,QAAQ;MACR;MACA;MACA;MACA;MACA,YAAY;IACd,CAAA;EACF;;;;EAKA,MAAa,OACX,YACA,SACkB;AAClB,QAAI;AACF,YAAM,KAAK,WAAW,YAAY,OAAA;AAClC,aAAO;IACT,SAAS,KAAc;AACrB,UAAI,eAAsB,eAAe,IAAI,eAAe,KAAK;AAC/D,eAAO;MACT;AACA,YAAM;IACR;EACF;;;;;;;EAQO,UACL,YACA,SAMmB;AACnB,WAAO,KAAK,iBAAiB,YAAY;MAAE,GAAG;MAAS,QAAQ;MAAG,QAAQ;IAAE,CAAA;EAC9E;;;;;;;;EASA,MAAa,iBACX,YACA,EAAE,QAAQ,QAAQ,GAAG,QAAA,GAQF;AACnB,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,QAAI,CAAC,kBAAkB,UAAA,GAAa;AAClC,YAAM,IAAW,uBAAuB,UAAA;IAC1C;AAEA,UAAM,UAAU,IAAI,QAAQ,OAAO,QAAQ,QAAQ,YAAY,CAAC,CAAA,CAAA;AAChE,QAAI,aAAa;AACjB,QAAI,UAAU,QAAQ;AACpB,UAAI,QAAQ;AACZ,UAAI,QAAQ;AACV,gBAAQ,SAAS,CAAC,MAAA;MACpB,OAAO;AACL,gBAAQ;AACR,iBAAS;MACX;AACA,UAAI,QAAQ;AACV,iBAAS,GAAI,CAAC,SAAS,SAAU,CAAA;MACnC;AACA,cAAQ,IAAI,SAAS,KAAA;AACrB,mBAAa;IACf;AAGA,UAAM,QAAgC;MACpC,GAAG,QAAQ;MACX,GAAI,QAAQ,YAAY;QAAE,WAAW,QAAQ;MAAU,IAAI,CAAC;IAC9D;AACA,WAAO,MAAM,KAAK,YAAY;MAC5B,QAAQ;MACR;MACA;MACA;MACA;MACA;MACA,YAAY;IACd,CAAA;EACF;;;;;;;EAQA,gBACE,QACA,YACA,UACE,CAAC,GACc;AACjB,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAW,uBAAsB;IACzC;AACA,QAAI,CAAC,kBAAkB,UAAA,GAAa;AAClC,YAAM,IAAW,uBAAuB,UAAA;IAC1C;AACA,UAAM,EAAE,SAAS,KAAI,IAAK,KAAK,oBAAoB;MACjD;MACA,YAAY,QAAQ;MACpB,OAAO,QAAQ;IACjB,CAAA;AACA,UAAM,cAAc,QAAQ,eAAe,oBAAI,KAAA;AAC/C,UAAM,gBAAgB,QAAQ,iBAAiB,KAAK,KAAK,KAAK;AAE9D,WAAO,UAAU;MACf,UAAU,KAAK;MACf;MACA;MACA;MACA,WAAW,KAAK;MAChB,WAAW,KAAK;MAChB,cAAc,KAAK;MACnB,QAAQ,KAAK;MACb,MAAM;MACN;IACF,CAAA;EACF;;;;;;EAOA,mBACE,YACA,UAMI,CAAC,GACY;AACjB,UAAM,EAAE,WAAW,gBAAgB,GAAG,aAAA,IAAiB;AACvD,UAAM,aAAqC;MACzC,GAAG;MACH,GAAI,YAAY;QAAE;MAAU,IAAI,CAAC;IACnC;AACA,WAAO,KAAK,gBAAgB,OAAO,YAAY;MAAE;MAAY,GAAG;IAAa,CAAA;EAC/E;;;;;;EAOA,OAAc,YACZ,UAWI,CAAC,GACsC;AAC3C,qBAAiB,UAAU,KAAK,mBAAmB;MAAE,GAAG;MAAS,WAAW;IAAG,CAAA,GAAI;AAGjF,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM;MACR,OAAO;AACL,cAAM,IAAI,MAAM,gDAAgD,MAAA,EAAQ;MAC1E;IACF;EACF;;;;;;EAOA,OAAc,mBACZ,SAa0D;AAC1D,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,QAAI,oBAAoB;AACxB,UAAM,WAAW,QAAQ,YAAY;AACrC,QAAI,WAAW,KAAK,WAAW,KAAO;AACpC,YAAM,IAAW,qBAAqB,uCAAA;IACxC;AACA,QAAI,cAAc;AAElB,WAAO,MAAM;AAEX,YAAM,UAAU,QAAQ,aAAa,KAAK,IAAI,UAAU,QAAQ,aAAa,WAAA,IAAe;AAC5F,UAAI,YAAY,GAAG;AACjB;MACF;AAEA,YAAM,eAAe,MAAM,KAAK,YAAY;QAC1C,QAAQ;QACR;QACA,YAAY;QACZ,OAAO;UACL,aAAa;UACb,QAAQ,QAAQ,UAAU;UAC1B,WAAW,QAAQ;UACnB,YAAY,OAAO,OAAA;UACnB,GAAI,oBAAoB;YAAE,sBAAsB;UAAkB,IAAI,CAAC;QACzE;QACA,YAAY;MACd,CAAA;AACA,YAAM,eAAe,MAAM,aAAa,KAAI;AAG5C,YAAM,OAAO,MAAS,YAAA,EAAc;AACpC,UAAI,CAAC,QAAQ,KAAK,SAAS,oBAAoB;AAC7C,cAAM,IAAI,MAAM,wBAAwB,YAAA,EAAc;MACxD;AAEA,YAAM,iBAAiB,KAAK,SACzB,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAA,EACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ;AAC5B,YAAM,UAA0C,CAAA;AAChD,iBAAW,iBAAiB,gBAAgB;AAC1C,gBAAQ,KAAK;UACX,MAAM;UACN,QAAQ,cAAc,WAAW;QACnC,CAAA;AACA;MACF;AAEA,iBAAW,iBAAiB,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,UAAA,GAAa;AAC9E,gBAAQ,KAAK;UACX,MAAM;UACN,KAAK,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,KAAA,GAAQ,WAAW;UACtE,MAAM,aAAa,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAA,GAAS,WAAW,EAAA;UACrF,MAAM,SAAS,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAA,GAAS,WAAW,IAAI,EAAA;UACrF,cAAc,IAAI,KAAK,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,cAAA,GAAiB,WAAW,SAAA;QACnG,CAAA;AACA;MACF;AAIA,cAAQ,KAAK,CAAC,GAAG,MAAA;AACf,cAAM,OAAO,EAAE,SAAS,WAAW,EAAE,MAAM,EAAE;AAC7C,cAAM,OAAO,EAAE,SAAS,WAAW,EAAE,MAAM,EAAE;AAC7C,eAAO,OAAO,OAAO,IAAI,OAAO,OAAO,KAAK;MAC9C,CAAA;AACA,iBAAW,SAAS,SAAS;AAC3B,cAAM;MACR;AACA,YAAM,cAAc,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,aAAA,GAAgB,YAAY;AACrF,UAAI,aAAa;AAEf,cAAM,wBAAwB,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,uBAAA,GAA0B;AAC7F,YAAI,CAAC,uBAAuB;AAC1B,gBAAM,IAAI,MAAM,kFAAA;QAClB;AACA,4BAAoB;MACtB,OAAO;AAEL;MACF;IACF;EACF;;;;EAKA,MAAM,UACJ,YACA,cACA,SAW6B;AAC7B,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,QAAI,CAAC,kBAAkB,UAAA,GAAa;AAClC,YAAM,IAAW,uBAAuB,UAAA;IAC1C;AAGA,QAAI;AACJ,QAAI;AACJ,QAAI,OAAO,iBAAiB,UAAU;AAEpC,YAAM,aAAa,IAAI,YAAA,EAAc,OAAO,YAAA;AAC5C,UAAI,OAAO,eAAe,SAAS,aAAa;AAC9C,iBAAS,eAAe,KAAK;UAAC;SAAW;MAC3C,OAAO;AAKL,iBAAS,IAAI,eAAe;UAAE,MAAM,GAAC;AAAI,cAAE,QAAQ,UAAA;AAAa,cAAE,MAAK;UAAI;QAAE,CAAA;MAC/E;AACA,aAAO,WAAW;IACpB,WAAW,wBAAwB,YAAY;AAC7C,UAAI,OAAO,eAAe,SAAS,aAAa;AAC9C,iBAAS,eAAe,KAAK;UAAC;SAAa;MAC7C,OAAO;AAEL,iBAAS,IAAI,eAAe;UAAE,MAAM,GAAC;AAAI,cAAE,QAAQ,YAAA;AAAe,cAAE,MAAK;UAAI;QAAE,CAAA;MACjF;AACA,aAAO,aAAa;IACtB,WAAW,wBAAwB,gBAAgB;AACjD,eAAS;IACX,OAAO;AACL,YAAM,IAAW,qBACf,oCAAoC;IAExC;AAGA,QAAI,SAAS,SAAS,QAAW;AAC/B,UAAI,SAAS,UAAa,SAAS,SAAS,MAAM;AAChD,cAAM,IAAW,qBACf,uBAAuB,QAAQ,IAAI,2CAA2C,IAAA,IAAQ;MAE1F;AACA,UAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,OAAO,KAAK,MAAM,QAAQ,IAAI,GAAG;AAC/E,cAAM,IAAW,qBACf,2BAA2B,QAAQ,IAAI,EAAE;MAE7C,OAAO;AACL,eAAO,QAAQ;MACjB;IACF;AAGA,UAAM,WAAW,SAAS,YAAY,KAAK,kBAAkB,IAAA;AAC7D,QAAI,WAAW,iBAAiB;AAC9B,YAAM,IAAW,qBAAqB,sCAAsC;IAC9E,WAAW,WAAW,iBAAiB;AACrC,YAAM,IAAW,qBAAqB,mCAAmC;IAC3E;AAKA,UAAM,UAAU,IAAI,oBAAoB,QAAA;AAIxC,UAAM,WAAW,IAAI,eAAe;MAClC,QAAQ;MACR;MACA;MACA;MACA,UAAU,SAAS,YAAY,CAAC;IAClC,CAAA;AAEA,UAAM,OAAO,YAAY,OAAA,EAAS,OAAO,QAAA;AACzC,WAAO,SAAS,UAAS;EAC3B;;;;;;;;;;;EAYU,kBAAkB,MAAkC;AAC5D,QAAI,SAAS,QAAW;AAItB,aAAO;IACT;AACA,QAAI,OAAO,eAAe;AACxB,YAAM,IAAI,UAAU,gCAAgC,aAAA,EAAe;IACrE;AACA,QAAI,WAAW,KAAK,OAAO;AAC3B,WAAO,MAAM;AAEX,UAAK,WAAW,MAAU,MAAM;AAC9B,eAAO;MACT;AAEA,kBAAY,KAAK,OAAO;IAC1B;EACF;;;;EAKA,MAAa,WACX,YACA,SAQuB;AACvB,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,QAAI,CAAC,kBAAkB,UAAA,GAAa;AAClC,YAAM,IAAW,uBAAuB,UAAA;IAC1C;AACA,UAAM,QAAgC,CAAC;AACvC,QAAI,SAAS,WAAW;AACtB,YAAM,YAAY,QAAQ;IAC5B;AAEA,UAAM,WAAW,MAAM,KAAK,YAAY;MACtC,QAAQ;MACR;MACA;MACA;;MAEA,SAAS,IAAI,QAAQ,SAAS,OAAA;IAChC,CAAA;AAEA,UAAM,WAA2B,CAAC;AAClC,eAAW,UAAU,cAAc;AACjC,UAAI,SAAS,QAAQ,IAAI,MAAA,GAAS;AAChC,iBAAS,MAAA,IAAU,SAAS,QAAQ,IAAI,MAAA;MAC1C;IACF;AAEA,aAAS,QAAQ,QAAQ,CAAC,QAAQ,QAAA;AAChC,UAAI,IAAI,WAAW,aAAA,GAAgB;AACjC,iBAAS,GAAA,IAAiC,SAAS,QAAQ,IAAI,GAAA;MACjE;IACF,CAAA;AAEA,WAAO;MACL,MAAM;MACN,KAAK;MACL,MAAM,SAAS,SAAS,QAAQ,IAAI,gBAAA,KAAqB,IAAI,EAAA;MAC7D;MACA,cAAc,IAAI,KAAK,SAAS,QAAQ,IAAI,eAAA,KAAoB,8BAAA;MAChE,WAAW,SAAS,QAAQ,IAAI,kBAAA,KAAuB;MACvD,MAAM,aAAa,SAAS,QAAQ,IAAI,MAAA,KAAW,EAAA;IACrD;EACF;;;;EAKA,MAAa,WACX,QACA,YACA,SAK2B;AAC3B,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,UAAM,mBAAmB,OAAO,oBAAoB;AACpD,QAAI,CAAC,kBAAkB,UAAA,GAAa;AAClC,YAAM,IAAW,uBAAuB,UAAA;IAC1C;AAIA,QAAI,iBAAiB,GAAG,gBAAA,IACtB,OAAO,UAAU,MAAM,GAAA,EAAK,IAAI,CAAC,SAAS,mBAAmB,IAAA,CAAA,EAAO,KAAK,GAAA,CAAA;AAE3E,QAAI,OAAO,gBAAiB,mBAAkB,cAAc,OAAO,eAAe;AAElF,UAAM,UAAU,IAAI,QAAQ,SAAS,QAAA;AACrC,QAAI,SAAS,aAAa,QAAW;AACnC,cAAQ,IAAI,4BAA4B,SAAA;IAC1C;AACA,YAAQ,IAAI,qBAAqB,cAAA;AAEjC,UAAM,WAAW,MAAM,KAAK,YAAY;MAAE,QAAQ;MAAO;MAAY;MAAY;MAAS,YAAY;IAAK,CAAA;AAE3G,UAAM,eAAe,MAAM,SAAS,KAAI;AAGxC,UAAM,OAAO,MAAS,YAAA,EAAc;AACpC,QAAI,CAAC,QAAQ,KAAK,SAAS,oBAAoB;AAC7C,YAAM,IAAI,MAAM,wBAAwB,YAAA,EAAc;IACxD;AACA,UAAM,aAAa,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAA,GAAS,WAAW;AAC5E,UAAM,qBAAqB,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,cAAA,GAAiB;AACjF,QAAI,uBAAuB,QAAW;AACpC,YAAM,IAAI,MAAM,kEAAA;IAClB;AAEA,WAAO;MACL,qBAAqB,SAAS,QAAQ,IAAI,8BAAA,KAAmC;MAC7E,MAAM,aAAa,UAAA;MACnB,cAAc,IAAI,KAAK,kBAAA;MACvB,WAAW,SAAS,QAAQ,IAAI,kBAAA,KAAuB;IACzD;EACF;;EAGA,MAAa,aAAa,YAAsC;AAC9D,QAAI;AACF,YAAM,UAAU,KAAK,YAAY;QAAE;MAAW,CAAA;AAE9C,YAAM,QAAQ,KAAI;AAClB,aAAO;IACT,SAAS,KAAc;AACrB,UAAI,eAAsB,eAAe,IAAI,eAAe,KAAK;AAC/D,eAAO;MACT;AACA,YAAM;IACR;EACF;;EAGA,MAAa,WAAW,YAAmC;AACzD,UAAM,KAAK,YAAY;MACrB,QAAQ;MACR,YAAY,KAAK,cAAc;QAAE;MAAW,CAAA;MAC5C,YAAY;MACZ,YAAY;IACd,CAAA;EACF;;EAGA,MAAa,aAAa,YAAmC;AAC3D,UAAM,KAAK,YAAY;MACrB,QAAQ;MACR,YAAY,KAAK,cAAc;QAAE;MAAW,CAAA;MAC5C,YAAY;MACZ,YAAY;IACd,CAAA;EACF;;;;;;;;;EAUA,oBACE,YACA,UAsBI,CAAC,GACyB;AAC9B,QAAI,CAAC,kBAAkB,UAAA,GAAa;AAClC,YAAM,IAAW,uBAAuB,UAAA;IAC1C;AAEA,UAAM,aAAa,KAAK,cAAc,OAAA;AACtC,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MACR,sHAAA;IAEJ;AAGA,UAAM,cAAc,QAAQ,eAAe,oBAAI,KAAA;AAC/C,UAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,WAAO,cAAc;MACnB,UAAU,KAAK;MACf,MAAM,KAAK;MACX,QAAQ;MACR,WAAW;MACX,WAAW,KAAK,aAAa;MAC7B,WAAW,KAAK,cAAc;MAC9B,QAAQ,KAAK;MACb,MAAM;MACN;MACA,YAAY,QAAQ;MACpB,QAAQ,QAAQ;IAClB,CAAA;EACF;AACF;;;AF3hCA,UAAqB;AAiBd,SAAS,kBAAkB,QAAQ;AAExC,QAAM,MAAM,CAAC;AAEb,SAAO,QAAQ,CAAC,UAAU;AACxB,UAAM,SAAS,SAAS,MAAM,GAAG;AACjC,QAAI,CAAC,OAAQ;AAEb,UAAM,KAAK,SAAS,OAAO,MAAM;AACjC,QAAI,IAAI,EAAE,EAAG;AAEb,QAAI,EAAE,IAAI,OAAO;AAAA,EACnB,CAAC;AAED,SAAO;AACT;AAfgB;AAoBT,SAAS,SAAS,QAAQ;AAC/B,SAAO,GAAG,OAAO,SAAS,IAAI,OAAO,SAAS,IAAI,OAAO,IAAI;AAC/D;AAFgB;AAQT,SAAS,SAAS,QAAQ,MAAM;AACrC,SAAW,cAAU;AAAA,IACnB,QAAQ;AAAA,IACR,UAAU,GAAG,OAAO,SAAS,IAAI,OAAO,SAAS;AAAA,IACjD,MAAM,OAAO,KAAK,QAAQ,gBAAgB,EAAE;AAAA,IAC5C;AAAA,IACA,OAAO,qBAAG,UAAU;AAAA,MAClB,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AACH;AAZgB;AAiBhB,eAAsB,cAAc,QAAQ;AAC1C,QAAM,SAAS,aAAa,MAAM;AAClC,SAAO,MAAM,OAAO,aAAa,OAAO,UAAU;AACpD;AAHsB;AAQf,SAAS,aAAa,QAAQ;AACnC,SAAO,IAAI,OAAS;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,UAAU,OACR,OAAO,KAAK,WAAW,WAAW,IAAI,KAAK,GAC7C,MAAM,OAAO,IAAI;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,WAAW;AAAA,IACX,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,EACpB,CAAC;AACH;AAXgB;AAgBT,SAAS,sBAAsB,GAAG;AACvC,SAAO,mBAAmB,CAAC,EAAE;AAAA,IAC3B;AAAA,IACA,CAAC;AAAA;AAAA,MAA8B,UAAW,KAAK,KAAK;AAAA;AAAA,EACtD;AACF;AALgB;AAUT,SAAS,oBAAoB,QAAQ;AAE1C,QAAM,MAAM,CAAC;AAEb,SAAO,QAAQ,CAAC,UAAU;AACxB,UAAM,SAAS,SAAS,MAAM,GAAG;AACjC,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,KAAK,SAAS,OAAO,MAAM;AAEjC,QAAI,IAAI,EAAE,GAAG;AACX,UAAI,EAAE,EAAE,OAAO,KAAK,KAAK;AAAA,IAC3B,OAAO;AACL,UAAI,EAAE,IAAI,EAAE,QAAQ,OAAO,QAAQ,QAAQ,CAAC,KAAK,EAAE;AAAA,IACrD;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAlBgB;AAuBhB,eAAsB,cAAc;AAClC,QAAM,IAAI,MAAU,IAAI,WAAW;AACnC,SAAO,IAAI,IAAI,CAAC;AAClB;AAHsB;AASf,SAAS,SAAS,WAAW;AAClC,QAAM,MAAU,UAAM,SAAS;AAC/B,MAAI,IAAI,WAAW,OAAQ,QAAO;AAClC,MAAI,CAAC,IAAI,KAAM,QAAO;AAEtB,QAAM,CAAC,WAAW,SAAS,IAAI,IAAI,UAAU,MAAM,GAAG,KAAK,CAAC;AAC5D,MAAI,CAAC,aAAa,CAAC,UAAW,QAAO;AAErC,QAAM,KAAK,qBAAG,MAAM,IAAI,SAAS,EAAE;AAEnC,QAAM,SAAS;AAAA,IACb;AAAA,IACA,YAAY,OAAO,GAAG,eAAe,WAAW,GAAG,aAAa;AAAA,IAChE,MAAM,IAAI;AAAA,IACV,MAAM,GAAG,eAAe,WAAW,GAAG,aAAa;AAAA,IACnD,QAAQ,OAAO,GAAG,WAAW,WAAW,GAAG,SAAS;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,QACH,OAAO,KAAK,QAAQ,OAAO,EAAE,IAAQ,sBAAkB,IAAI,QAAQ,EAAE,GACnE;AAAA,IACC;AAAA,IACA;AAAA,EACF;AAEJ,SAAO,EAAE,QAAQ,KAAK;AACxB;AA3BgB;AAgChB,eAAsB,YAAY,OAAO;AACvC,QAAU,IAAI,aAAa,KAAK;AAClC;AAFsB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-AISBWLUT.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AKDQWSN2.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-AKDQWSN2.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AKDQWSN2.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-AKDQWSN2.js.map
+159
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-C7BSJ3AC.js
··· 1 + import { 2 + createEmptyFavouritesPlaylist 3 + } from "./chunk-CPS76EE2.js"; 4 + import { 5 + match 6 + } from "./chunk-CW32SP4O.js"; 7 + import { 8 + BroadcastableDiffuseElement, 9 + query 10 + } from "./chunk-H46AZIKM.js"; 11 + import { 12 + computed, 13 + signal 14 + } from "./chunk-IZOBPV2S.js"; 15 + import { 16 + __name, 17 + init_Buffer, 18 + init_process 19 + } from "./chunk-FZQXS3RE.js"; 20 + 21 + // components/orchestrator/favourites/element.js 22 + init_Buffer(); 23 + init_process(); 24 + var FavouritesOrchestrator = class extends BroadcastableDiffuseElement { 25 + static { 26 + __name(this, "FavouritesOrchestrator"); 27 + } 28 + static NAME = "diffuse/orchestrator/favourites"; 29 + static WORKER_URL = "components/orchestrator/favourites/worker.js"; 30 + /** @type {ProxiedActions<Actions>} */ 31 + #proxy; 32 + constructor() { 33 + super(); 34 + this.#proxy = this.workerProxy(); 35 + this.include = this.include.bind(this); 36 + this.expel = this.expel.bind(this); 37 + this.toggle = this.toggle.bind(this); 38 + } 39 + // SIGNALS 40 + #output = signal( 41 + /** @type {OutputElement | null} */ 42 + null 43 + ); 44 + // STATE 45 + /** 46 + * Returns the favourites playlist. 47 + * @returns {Playlist} 48 + */ 49 + playlist = computed(() => { 50 + const output = this.#output.value; 51 + if (!output) return createEmptyFavouritesPlaylist(); 52 + const playlists = output.playlists.collection(); 53 + return playlists?.find((p) => p.id === "favourites") ?? createEmptyFavouritesPlaylist(); 54 + }); 55 + // LIFECYCLE 56 + /** 57 + * @override 58 + */ 59 + async connectedCallback() { 60 + if (this.hasAttribute("group")) { 61 + const actions = this.broadcast(this.nameWithGroup, { 62 + include: { strategy: "leaderOnly", fn: this.include }, 63 + expel: { strategy: "leaderOnly", fn: this.expel }, 64 + toggle: { strategy: "leaderOnly", fn: this.toggle } 65 + }); 66 + if (actions) { 67 + this.include = actions.include; 68 + this.expel = actions.expel; 69 + this.toggle = actions.toggle; 70 + } 71 + } 72 + super.connectedCallback(); 73 + const output = query(this, "output-selector"); 74 + await customElements.whenDefined(output.localName); 75 + this.#output.value = output; 76 + } 77 + // ACTIONS 78 + /** 79 + * Add one or more tracks to favourites. 80 + * @param {Track | Track[]} tracks 81 + */ 82 + async include(tracks) { 83 + const tracksArray = Array.isArray(tracks) ? tracks : [tracks]; 84 + if (tracksArray.length === 0) return; 85 + const output = this.#output.value; 86 + if (!output) { 87 + console.warn("Favourites orchestrator: output element not ready"); 88 + return; 89 + } 90 + const playlists = output.playlists.collection(); 91 + const result = await this.#proxy.include({ 92 + playlists, 93 + tracks: tracksArray 94 + }); 95 + if (result) await output.playlists.save(result); 96 + } 97 + /** 98 + * Remove one or more tracks from favourites. 99 + * @param {Track | Track[]} tracks 100 + */ 101 + async expel(tracks) { 102 + const tracksArray = Array.isArray(tracks) ? tracks : [tracks]; 103 + if (tracksArray.length === 0) return; 104 + const output = this.#output.value; 105 + if (!output) { 106 + console.warn("Favourites orchestrator: output element not ready"); 107 + return; 108 + } 109 + const playlists = output.playlists.collection(); 110 + const result = await this.#proxy.expel({ 111 + playlists, 112 + tracks: tracksArray 113 + }); 114 + if (result) await output.playlists.save(result); 115 + } 116 + /** 117 + * Toggle favourite status for one or more tracks. 118 + * Adds tracks if not in favourites, removes if already favourited. 119 + * @param {Track | Track[]} tracks 120 + */ 121 + async toggle(tracks) { 122 + const tracksArray = Array.isArray(tracks) ? tracks : [tracks]; 123 + if (tracksArray.length === 0) return; 124 + const output = this.#output.value; 125 + if (!output) { 126 + console.warn("Favourites orchestrator: output element not ready"); 127 + return; 128 + } 129 + const playlists = output.playlists.collection(); 130 + const result = await this.#proxy.toggle({ 131 + playlists, 132 + tracks: tracksArray 133 + }); 134 + if (result) await output.playlists.save(result); 135 + } 136 + // 🛠️ 137 + /** 138 + * Check if a track is a favourite. 139 + * 140 + * @param {Track} track 141 + */ 142 + isFavourite(track) { 143 + return this.playlist().items.some((item) => { 144 + return match(track, item); 145 + }); 146 + } 147 + }; 148 + var element_default = FavouritesOrchestrator; 149 + var CLASS = FavouritesOrchestrator; 150 + var NAME = "do-favourites"; 151 + customElements.define(NAME, CLASS); 152 + 153 + export { 154 + element_default, 155 + CLASS, 156 + NAME 157 + }; 158 + 159 + //# sourceMappingURL=./chunk-C7BSJ3AC.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-C7BSJ3AC.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/favourites/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement, query } from \"@common/element.js\";\nimport { match as matchPlaylistItem } from \"@common/playlist.js\";\nimport { computed, signal } from \"@common/signal.js\";\nimport { createEmptyFavouritesPlaylist } from \"./common.js\";\n\n/**\n * @import {Track} from \"@definitions/types.d.ts\"\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n * @import {Actions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass FavouritesOrchestrator extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/orchestrator/favourites\";\n static WORKER_URL = \"components/orchestrator/favourites/worker.js\";\n\n /** @type {ProxiedActions<Actions>} */\n #proxy;\n\n constructor() {\n super();\n\n this.#proxy = this.workerProxy();\n\n // Bind methods for broadcasting\n this.include = this.include.bind(this);\n this.expel = this.expel.bind(this);\n this.toggle = this.toggle.bind(this);\n }\n\n // SIGNALS\n\n #output = signal(/** @type {OutputElement | null} */ (null));\n\n // STATE\n\n /**\n * Returns the favourites playlist.\n * @returns {Playlist}\n */\n playlist = computed(() => {\n const output = this.#output.value;\n if (!output) return createEmptyFavouritesPlaylist();\n\n const playlists = output.playlists.collection();\n return playlists?.find((p) => p.id === \"favourites\") ??\n createEmptyFavouritesPlaylist();\n });\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n include: { strategy: \"leaderOnly\", fn: this.include },\n expel: { strategy: \"leaderOnly\", fn: this.expel },\n toggle: { strategy: \"leaderOnly\", fn: this.toggle },\n });\n\n if (actions) {\n this.include = actions.include;\n this.expel = actions.expel;\n this.toggle = actions.toggle;\n }\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {OutputElement} */\n const output = query(this, \"output-selector\");\n\n // Wait until defined\n await customElements.whenDefined(output.localName);\n\n this.#output.value = output;\n }\n\n // ACTIONS\n\n /**\n * Add one or more tracks to favourites.\n * @param {Track | Track[]} tracks\n */\n async include(tracks) {\n const tracksArray = Array.isArray(tracks) ? tracks : [tracks];\n if (tracksArray.length === 0) return;\n\n const output = this.#output.value;\n if (!output) {\n console.warn(\"Favourites orchestrator: output element not ready\");\n return;\n }\n\n const playlists = output.playlists.collection();\n const result = await this.#proxy.include({\n playlists,\n tracks: tracksArray,\n });\n if (result) await output.playlists.save(result);\n }\n\n /**\n * Remove one or more tracks from favourites.\n * @param {Track | Track[]} tracks\n */\n async expel(tracks) {\n const tracksArray = Array.isArray(tracks) ? tracks : [tracks];\n if (tracksArray.length === 0) return;\n\n const output = this.#output.value;\n if (!output) {\n console.warn(\"Favourites orchestrator: output element not ready\");\n return;\n }\n\n const playlists = output.playlists.collection();\n const result = await this.#proxy.expel({\n playlists,\n tracks: tracksArray,\n });\n\n if (result) await output.playlists.save(result);\n }\n\n /**\n * Toggle favourite status for one or more tracks.\n * Adds tracks if not in favourites, removes if already favourited.\n * @param {Track | Track[]} tracks\n */\n async toggle(tracks) {\n const tracksArray = Array.isArray(tracks) ? tracks : [tracks];\n if (tracksArray.length === 0) return;\n\n const output = this.#output.value;\n if (!output) {\n console.warn(\"Favourites orchestrator: output element not ready\");\n return;\n }\n\n const playlists = output.playlists.collection();\n const result = await this.#proxy.toggle({\n playlists,\n tracks: tracksArray,\n });\n\n if (result) await output.playlists.save(result);\n }\n\n // 🛠️\n\n /**\n * Check if a track is a favourite.\n *\n * @param {Track} track\n */\n isFavourite(track) {\n return this.playlist().items.some((item) => {\n return matchPlaylistItem(track, item);\n });\n }\n}\n\nexport default FavouritesOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = FavouritesOrchestrator;\nexport const NAME = \"do-favourites\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-C7BSJ3AC.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CMU4QLMC.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CMU4QLMC.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CPN2PPDQ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPN2PPDQ.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CPN2PPDQ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPN2PPDQ.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CPS76EE2.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPS76EE2.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CPS76EE2.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPS76EE2.js.map
+68
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CTVRRF4G.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + signal 6 + } from "./chunk-IZOBPV2S.js"; 7 + import { 8 + listen 9 + } from "./chunk-EJ2QF5QE.js"; 10 + import { 11 + __export, 12 + __name, 13 + init_Buffer, 14 + init_process 15 + } from "./chunk-FZQXS3RE.js"; 16 + 17 + // components/processor/search/element.js 18 + var element_exports = {}; 19 + __export(element_exports, { 20 + CLASS: () => CLASS, 21 + NAME: () => NAME, 22 + default: () => element_default 23 + }); 24 + init_Buffer(); 25 + init_process(); 26 + var SearchProcessor = class extends DiffuseElement { 27 + static { 28 + __name(this, "SearchProcessor"); 29 + } 30 + static NAME = "diffuse/processor/search"; 31 + static WORKER_URL = "components/processor/search/worker.js"; 32 + constructor() { 33 + super(); 34 + this.proxy = this.workerProxy(); 35 + this.search = this.proxy.search; 36 + this.supply = this.proxy.supply; 37 + } 38 + // SIGNALS 39 + #supplyFingerprint = signal( 40 + /** @type {string | undefined} */ 41 + void 0 42 + ); 43 + // STATE 44 + supplyFingerprint = this.#supplyFingerprint.get; 45 + // LIFECYCLE 46 + /** 47 + * @override 48 + */ 49 + connectedCallback() { 50 + super.connectedCallback(); 51 + const link = this.workerLink(); 52 + listen("supplyFingerprint", this.#supplyFingerprint.set, link); 53 + this.proxy.supplyFingerprint().then(this.#supplyFingerprint.set); 54 + } 55 + }; 56 + var element_default = SearchProcessor; 57 + var CLASS = SearchProcessor; 58 + var NAME = "dp-search"; 59 + customElements.define(NAME, SearchProcessor); 60 + 61 + export { 62 + element_default, 63 + CLASS, 64 + NAME, 65 + element_exports 66 + }; 67 + 68 + //# sourceMappingURL=./chunk-CTVRRF4G.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CTVRRF4G.js.map
··· 1 + {"version":3,"sources":["/components/processor/search/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\nimport { listen } from \"@common/worker.js\";\n\n/**\n * @import {ProxiedActions} from \"@common/worker.d.ts\";\n * @import {Actions, State} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<Actions>}\n */\nclass SearchProcessor extends DiffuseElement {\n static NAME = \"diffuse/processor/search\";\n static WORKER_URL = \"components/processor/search/worker.js\";\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<Actions & State>} */\n this.proxy = this.workerProxy();\n\n this.search = this.proxy.search;\n this.supply = this.proxy.supply;\n }\n\n // SIGNALS\n\n #supplyFingerprint = signal(/** @type {string | undefined} */ (undefined));\n\n // STATE\n\n supplyFingerprint = this.#supplyFingerprint.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n // Sync data with worker\n const link = this.workerLink();\n\n // Listen for remote data changes\n listen(\"supplyFingerprint\", this.#supplyFingerprint.set, link);\n\n // Fetch current data state\n this.proxy.supplyFingerprint().then(this.#supplyFingerprint.set);\n }\n}\n\nexport default SearchProcessor;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = SearchProcessor;\nexport const NAME = \"dp-search\";\n\ncustomElements.define(NAME, SearchProcessor);\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,IAAM,kBAAN,cAA8B,eAAe;AAAA,EAhB7C,OAgB6C;AAAA;AAAA;AAAA,EAC3C,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,KAAK,YAAY;AAE9B,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,SAAS,KAAK,MAAM;AAAA,EAC3B;AAAA;AAAA,EAIA,qBAAqB;AAAA;AAAA,IAA0C;AAAA,EAAU;AAAA;AAAA,EAIzE,oBAAoB,KAAK,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5C,oBAAoB;AAClB,UAAM,kBAAkB;AAGxB,UAAM,OAAO,KAAK,WAAW;AAG7B,WAAO,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAG7D,SAAK,MAAM,kBAAkB,EAAE,KAAK,KAAK,mBAAmB,GAAG;AAAA,EACjE;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,eAAe;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-CTVRRF4G.js.map"}
+86
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CW32SP4O.js
··· 1 + import { 2 + __name, 3 + init_Buffer, 4 + init_process 5 + } from "./chunk-FZQXS3RE.js"; 6 + 7 + // common/playlist.js 8 + init_Buffer(); 9 + init_process(); 10 + function transform(val, transformations) { 11 + if (!val || !transformations) return val; 12 + return transformations.reduce((v, t) => { 13 + try { 14 + return v[t](); 15 + } catch (_) { 16 + return v; 17 + } 18 + }, val); 19 + } 20 + __name(transform, "transform"); 21 + function match(track, item) { 22 + return item.criteria.every((c) => { 23 + let value = track; 24 + let critValue = c.value; 25 + c.field.split(".").forEach((f) => { 26 + if (value) value = value[f]; 27 + }); 28 + if (value && c.transformations) { 29 + c.transformations.forEach((t) => { 30 + try { 31 + value = value[t](); 32 + critValue = critValue[t](); 33 + } catch (err) { 34 + } 35 + }); 36 + } 37 + return critValue === value; 38 + }); 39 + } 40 + __name(match, "match"); 41 + function filterByPlaylist(tracks, playlist) { 42 + const shapes = playlist.items.reduce( 43 + (acc, item) => { 44 + const shapeKey = item.criteria.map((c) => `${c.field}\0${(c.transformations ?? []).join(",")}`).join("\0\0"); 45 + const group = acc.get(shapeKey) ?? acc.set(shapeKey, { criteria: item.criteria, keys: /* @__PURE__ */ new Set() }).get(shapeKey); 46 + group?.keys.add( 47 + item.criteria.map((c) => transform(c.value, c.transformations)).join( 48 + "\0" 49 + ) 50 + ); 51 + return acc; 52 + }, 53 + /** @type {Map<string, { criteria: PlaylistItem["criteria"], keys: Set<string> }>} */ 54 + /* @__PURE__ */ new Map() 55 + ).values().map((group) => ({ 56 + fields: group.criteria.map((c) => ({ 57 + parts: c.field.split("."), 58 + transformations: c.transformations 59 + })), 60 + keys: group.keys 61 + })).toArray(); 62 + return tracks.filter( 63 + (track) => shapes.some( 64 + (shape) => shape.keys.has( 65 + shape.fields.map( 66 + ({ parts, transformations }) => transform( 67 + parts.reduce( 68 + (v, f) => v?.[f], 69 + /** @type {any} */ 70 + track 71 + ), 72 + transformations 73 + ) 74 + ).join("\0") 75 + ) 76 + ) 77 + ); 78 + } 79 + __name(filterByPlaylist, "filterByPlaylist"); 80 + 81 + export { 82 + match, 83 + filterByPlaylist 84 + }; 85 + 86 + //# sourceMappingURL=./chunk-CW32SP4O.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CW32SP4O.js.map
··· 1 + {"version":3,"sources":["/common/playlist.js"],"sourcesContent":["/**\n * @import {Playlist, PlaylistItem, Track} from \"@definitions/types.d.ts\"\n */\n\n/**\n * @param {any} val\n * @param {string[] | undefined} transformations\n */\nfunction transform(val, transformations) {\n if (!val || !transformations) return val;\n return transformations.reduce((v, t) => {\n try {\n return v[t]();\n } catch (_) {\n return v;\n }\n }, val);\n}\n\n/**\n * Check if a track matches the criteria of a playlist item.\n *\n * @param {Track} track\n * @param {PlaylistItem} item\n */\nexport function match(track, item) {\n return item.criteria.every((c) => {\n /** @type {any} */\n let value = track;\n\n /** @type {any} */\n let critValue = c.value;\n\n c.field.split(\".\").forEach((f) => {\n if (value) value = value[f];\n });\n\n if (value && c.transformations) {\n c.transformations.forEach((t) => {\n try {\n value = value[t]();\n critValue = critValue[t]();\n } catch (err) {}\n });\n }\n\n return critValue === value;\n });\n}\n\n/**\n * Filter tracks by playlist membership using an indexed lookup.\n *\n * @param {Track[]} tracks\n * @param {Playlist} playlist\n */\nexport function filterByPlaylist(tracks, playlist) {\n // Group playlist items by criteria shape, building a Set index per shape.\n const shapes = playlist.items\n .reduce(\n (acc, item) => {\n const shapeKey = item.criteria\n .map((c) => `${c.field}\\0${(c.transformations ?? []).join(\",\")}`)\n .join(\"\\0\\0\");\n\n const group = acc.get(shapeKey) ?? acc\n .set(shapeKey, { criteria: item.criteria, keys: new Set() })\n .get(shapeKey);\n\n group?.keys.add(\n item.criteria.map((c) => transform(c.value, c.transformations)).join(\n \"\\0\",\n ),\n );\n\n return acc;\n },\n /** @type {Map<string, { criteria: PlaylistItem[\"criteria\"], keys: Set<string> }>} */ (new Map()),\n )\n .values()\n .map((group) => ({\n fields: group.criteria.map((c) => ({\n parts: c.field.split(\".\"),\n transformations: c.transformations,\n })),\n keys: group.keys,\n }))\n .toArray();\n\n return tracks.filter((track) =>\n shapes.some((shape) =>\n shape.keys.has(\n shape.fields\n .map(({ parts, transformations }) =>\n transform(\n parts.reduce((v, f) => v?.[f], /** @type {any} */ (track)),\n transformations,\n )\n )\n .join(\"\\0\"),\n )\n )\n );\n}\n"],"mappings":";;;;;;;AAAA;AAAA;AAQA,SAAS,UAAU,KAAK,iBAAiB;AACvC,MAAI,CAAC,OAAO,CAAC,gBAAiB,QAAO;AACrC,SAAO,gBAAgB,OAAO,CAAC,GAAG,MAAM;AACtC,QAAI;AACF,aAAO,EAAE,CAAC,EAAE;AAAA,IACd,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF,GAAG,GAAG;AACR;AATS;AAiBF,SAAS,MAAM,OAAO,MAAM;AACjC,SAAO,KAAK,SAAS,MAAM,CAAC,MAAM;AAEhC,QAAI,QAAQ;AAGZ,QAAI,YAAY,EAAE;AAElB,MAAE,MAAM,MAAM,GAAG,EAAE,QAAQ,CAAC,MAAM;AAChC,UAAI,MAAO,SAAQ,MAAM,CAAC;AAAA,IAC5B,CAAC;AAED,QAAI,SAAS,EAAE,iBAAiB;AAC9B,QAAE,gBAAgB,QAAQ,CAAC,MAAM;AAC/B,YAAI;AACF,kBAAQ,MAAM,CAAC,EAAE;AACjB,sBAAY,UAAU,CAAC,EAAE;AAAA,QAC3B,SAAS,KAAK;AAAA,QAAC;AAAA,MACjB,CAAC;AAAA,IACH;AAEA,WAAO,cAAc;AAAA,EACvB,CAAC;AACH;AAvBgB;AA+BT,SAAS,iBAAiB,QAAQ,UAAU;AAEjD,QAAM,SAAS,SAAS,MACrB;AAAA,IACC,CAAC,KAAK,SAAS;AACb,YAAM,WAAW,KAAK,SACnB,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,MAAM,EAAE,mBAAmB,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,EAC/D,KAAK,MAAM;AAEd,YAAM,QAAQ,IAAI,IAAI,QAAQ,KAAK,IAChC,IAAI,UAAU,EAAE,UAAU,KAAK,UAAU,MAAM,oBAAI,IAAI,EAAE,CAAC,EAC1D,IAAI,QAAQ;AAEf,aAAO,KAAK;AAAA,QACV,KAAK,SAAS,IAAI,CAAC,MAAM,UAAU,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,IACuF,oBAAI,IAAI;AAAA,EACjG,EACC,OAAO,EACP,IAAI,CAAC,WAAW;AAAA,IACf,QAAQ,MAAM,SAAS,IAAI,CAAC,OAAO;AAAA,MACjC,OAAO,EAAE,MAAM,MAAM,GAAG;AAAA,MACxB,iBAAiB,EAAE;AAAA,IACrB,EAAE;AAAA,IACF,MAAM,MAAM;AAAA,EACd,EAAE,EACD,QAAQ;AAEX,SAAO,OAAO;AAAA,IAAO,CAAC,UACpB,OAAO;AAAA,MAAK,CAAC,UACX,MAAM,KAAK;AAAA,QACT,MAAM,OACH;AAAA,UAAI,CAAC,EAAE,OAAO,gBAAgB,MAC7B;AAAA,YACE,MAAM;AAAA,cAAO,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA;AAAA,cAAuB;AAAA,YAAM;AAAA,YACzD;AAAA,UACF;AAAA,QACF,EACC,KAAK,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AA/CgB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-CW32SP4O.js.map"}
+163
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-DG4EBNDV.js
··· 1 + import { 2 + INITIAL_FACETS_DOCUMENT, 3 + INITIAL_PLAYLISTS_DOCUMENT, 4 + INITIAL_THEMES_DOCUMENT, 5 + INITIAL_TRACKS_DOCUMENT 6 + } from "./chunk-R65OZ4FV.js"; 7 + import { 8 + OutputTransformer 9 + } from "./chunk-3G4WUGDN.js"; 10 + import { 11 + it, 12 + rt, 13 + st 14 + } from "./chunk-P3M4HQTD.js"; 15 + import { 16 + computed 17 + } from "./chunk-IZOBPV2S.js"; 18 + import { 19 + recursivelyCloneRecords, 20 + removeUndefinedValuesFromRecord 21 + } from "./chunk-DUCTMCPX.js"; 22 + import { 23 + isUint8Array 24 + } from "./chunk-UGE3FKYA.js"; 25 + import { 26 + __name, 27 + init_Buffer, 28 + init_process 29 + } from "./chunk-FZQXS3RE.js"; 30 + 31 + // components/transformer/output/bytes/automerge/element.js 32 + init_Buffer(); 33 + init_process(); 34 + var AutomergeBytesOutputTransformer = class extends OutputTransformer { 35 + static { 36 + __name(this, "AutomergeBytesOutputTransformer"); 37 + } 38 + constructor() { 39 + super(); 40 + const base = this.base(); 41 + const facetsDocument = computed(() => { 42 + const value = base.facets.collection(); 43 + if (isUint8Array(value)) { 44 + return st(value); 45 + } else if (value == void 0) { 46 + return INITIAL_FACETS_DOCUMENT; 47 + } else { 48 + throw new Error("Invalid data type"); 49 + } 50 + }); 51 + const playlistsDocument = computed(() => { 52 + const value = base.playlists.collection(); 53 + if (isUint8Array(value)) { 54 + return st(value); 55 + } else if (value == void 0) { 56 + return INITIAL_PLAYLISTS_DOCUMENT; 57 + } else { 58 + throw new Error("Invalid data type"); 59 + } 60 + }); 61 + const themesDocument = computed(() => { 62 + const value = base.themes.collection(); 63 + if (isUint8Array(value)) { 64 + return st(value); 65 + } else if (value == void 0) { 66 + return INITIAL_THEMES_DOCUMENT; 67 + } else { 68 + throw new Error("Invalid data type"); 69 + } 70 + }); 71 + const tracksDocument = computed(() => { 72 + const value = base.tracks.collection(); 73 + if (isUint8Array(value)) { 74 + return st(value); 75 + } else if (value == void 0) { 76 + return INITIAL_TRACKS_DOCUMENT; 77 + } else { 78 + throw new Error("Invalid data type"); 79 + } 80 + }); 81 + const manager = { 82 + facets: { 83 + ...base.facets, 84 + collection: computed(() => facetsDocument().collection), 85 + save: /* @__PURE__ */ __name(async (newFacets) => { 86 + const doc = rt(facetsDocument(), (d) => { 87 + const clonedCollection = newFacets.map((facet) => { 88 + return removeUndefinedValuesFromRecord( 89 + recursivelyCloneRecords(facet) 90 + ); 91 + }); 92 + d.collection = clonedCollection; 93 + }); 94 + const bytes = it(doc); 95 + await base.facets.save(bytes); 96 + }, "save") 97 + }, 98 + playlists: { 99 + ...base.playlists, 100 + collection: computed(() => playlistsDocument().collection), 101 + save: /* @__PURE__ */ __name(async (newPlaylists) => { 102 + const doc = rt(playlistsDocument(), (d) => { 103 + const clonedCollection = newPlaylists.map((facet) => { 104 + return recursivelyCloneRecords(facet); 105 + }); 106 + d.collection = clonedCollection; 107 + }); 108 + const bytes = it(doc); 109 + await base.playlists.save(bytes); 110 + }, "save") 111 + }, 112 + themes: { 113 + ...base.themes, 114 + collection: computed(() => themesDocument().collection), 115 + save: /* @__PURE__ */ __name(async (newThemes) => { 116 + const doc = rt(themesDocument(), (d) => { 117 + const clonedCollection = newThemes.map((theme) => { 118 + return removeUndefinedValuesFromRecord( 119 + recursivelyCloneRecords(theme) 120 + ); 121 + }); 122 + d.collection = clonedCollection; 123 + }); 124 + const bytes = it(doc); 125 + await base.themes.save(bytes); 126 + }, "save") 127 + }, 128 + tracks: { 129 + ...base.tracks, 130 + collection: computed(() => tracksDocument().collection), 131 + save: /* @__PURE__ */ __name(async (newTracks) => { 132 + const doc = rt(tracksDocument(), (d) => { 133 + const clonedCollection = newTracks.map((track) => { 134 + return recursivelyCloneRecords(track); 135 + }); 136 + d.collection = clonedCollection; 137 + }); 138 + const bytes = it(doc); 139 + await base.tracks.save(bytes); 140 + }, "save") 141 + }, 142 + // Other 143 + ready: base.ready 144 + }; 145 + this.facets = manager.facets; 146 + this.playlists = manager.playlists; 147 + this.themes = manager.themes; 148 + this.tracks = manager.tracks; 149 + this.ready = manager.ready; 150 + } 151 + }; 152 + var element_default = AutomergeBytesOutputTransformer; 153 + var CLASS = AutomergeBytesOutputTransformer; 154 + var NAME = "dtob-automerge"; 155 + customElements.define(NAME, CLASS); 156 + 157 + export { 158 + element_default, 159 + CLASS, 160 + NAME 161 + }; 162 + 163 + //# sourceMappingURL=./chunk-DG4EBNDV.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-DG4EBNDV.js.map
··· 1 + {"version":3,"sources":["/components/transformer/output/bytes/automerge/element.js"],"sourcesContent":["import * as Automerge from \"@automerge/automerge\";\nimport { isUint8Array } from \"iso-base/utils\";\n\nimport { computed } from \"@common/signal.js\";\nimport {\n recursivelyCloneRecords,\n removeUndefinedValuesFromRecord,\n} from \"@common/utils.js\";\nimport { OutputTransformer } from \"../../base.js\";\nimport {\n INITIAL_FACETS_DOCUMENT,\n INITIAL_PLAYLISTS_DOCUMENT,\n INITIAL_THEMES_DOCUMENT,\n INITIAL_TRACKS_DOCUMENT,\n} from \"./constants.js\";\n\n/**\n * @import { SignalReader } from \"@common/signal.d.ts\";\n * @import { OutputManagerDeputy } from \"@components/output/types.d.ts\"\n * @import { FacetsDocument, PlaylistsDocument, ThemesDocument, TracksDocument } from \"./types.d.ts\"\n */\n\n/**\n * @extends {OutputTransformer<Uint8Array>}\n */\nclass AutomergeBytesOutputTransformer extends OutputTransformer {\n constructor() {\n super();\n\n const base = this.base();\n\n /** @type {SignalReader<Automerge.Doc<FacetsDocument>>} */\n const facetsDocument = computed(() => {\n const value = base.facets.collection();\n\n if (isUint8Array(value)) {\n return Automerge.load(value);\n } else if (value == undefined) {\n return INITIAL_FACETS_DOCUMENT;\n } else {\n // TODO: Better error\n throw new Error(\"Invalid data type\");\n }\n });\n\n /** @type {SignalReader<Automerge.Doc<PlaylistsDocument>>} */\n const playlistsDocument = computed(() => {\n const value = base.playlists.collection();\n\n if (isUint8Array(value)) {\n return Automerge.load(value);\n } else if (value == undefined) {\n return INITIAL_PLAYLISTS_DOCUMENT;\n } else {\n // TODO: Better error\n throw new Error(\"Invalid data type\");\n }\n });\n\n /** @type {SignalReader<Automerge.Doc<ThemesDocument>>} */\n const themesDocument = computed(() => {\n const value = base.themes.collection();\n\n if (isUint8Array(value)) {\n return Automerge.load(value);\n } else if (value == undefined) {\n return INITIAL_THEMES_DOCUMENT;\n } else {\n // TODO: Better error\n throw new Error(\"Invalid data type\");\n }\n });\n\n /** @type {SignalReader<Automerge.Doc<TracksDocument>>} */\n const tracksDocument = computed(() => {\n const value = base.tracks.collection();\n\n if (isUint8Array(value)) {\n return Automerge.load(value);\n } else if (value == undefined) {\n return INITIAL_TRACKS_DOCUMENT;\n } else {\n // TODO: Better error\n throw new Error(\"Invalid data type\");\n }\n });\n\n /** @type {OutputManagerDeputy} */\n const manager = {\n facets: {\n ...base.facets,\n collection: computed(() => facetsDocument().collection),\n save: async (newFacets) => {\n const doc = Automerge.change(facetsDocument(), (d) => {\n const clonedCollection = newFacets.map((facet) => {\n return removeUndefinedValuesFromRecord(\n recursivelyCloneRecords(facet),\n );\n });\n\n d.collection = clonedCollection;\n });\n\n const bytes = Automerge.save(doc);\n await base.facets.save(bytes);\n },\n },\n playlists: {\n ...base.playlists,\n collection: computed(() => playlistsDocument().collection),\n save: async (newPlaylists) => {\n const doc = Automerge.change(playlistsDocument(), (d) => {\n const clonedCollection = newPlaylists.map((facet) => {\n return recursivelyCloneRecords(facet);\n });\n\n d.collection = clonedCollection;\n });\n\n const bytes = Automerge.save(doc);\n await base.playlists.save(bytes);\n },\n },\n themes: {\n ...base.themes,\n collection: computed(() => themesDocument().collection),\n save: async (newThemes) => {\n const doc = Automerge.change(themesDocument(), (d) => {\n const clonedCollection = newThemes.map((theme) => {\n return removeUndefinedValuesFromRecord(\n recursivelyCloneRecords(theme),\n );\n });\n\n d.collection = clonedCollection;\n });\n\n const bytes = Automerge.save(doc);\n await base.themes.save(bytes);\n },\n },\n tracks: {\n ...base.tracks,\n collection: computed(() => tracksDocument().collection),\n save: async (newTracks) => {\n const doc = Automerge.change(tracksDocument(), (d) => {\n const clonedCollection = newTracks.map((track) => {\n return recursivelyCloneRecords(track);\n });\n\n d.collection = clonedCollection;\n });\n\n const bytes = Automerge.save(doc);\n await base.tracks.save(bytes);\n },\n },\n\n // Other\n ready: base.ready,\n };\n\n // Assign manager properties to class\n this.facets = manager.facets;\n this.playlists = manager.playlists;\n this.themes = manager.themes;\n this.tracks = manager.tracks;\n this.ready = manager.ready;\n }\n}\n\nexport default AutomergeBytesOutputTransformer;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = AutomergeBytesOutputTransformer;\nexport const NAME = \"dtob-automerge\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-DG4EBNDV.js.map"}
+178
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-DH43DE2O.js
··· 1 + import { 2 + element_default 3 + } from "./chunk-2726SF3Z.js"; 4 + import { 5 + DiffuseElement 6 + } from "./chunk-H46AZIKM.js"; 7 + import { 8 + signal 9 + } from "./chunk-IZOBPV2S.js"; 10 + import { 11 + debounceMicrotask 12 + } from "./chunk-EJ2QF5QE.js"; 13 + import { 14 + __name, 15 + init_Buffer, 16 + init_process 17 + } from "./chunk-FZQXS3RE.js"; 18 + 19 + // themes/webamp/window-manager/element.js 20 + init_Buffer(); 21 + init_process(); 22 + var WindowManager = class extends DiffuseElement { 23 + static { 24 + __name(this, "WindowManager"); 25 + } 26 + constructor() { 27 + super(); 28 + this.attachShadow({ mode: "open" }); 29 + this.focusOnWindow = this.focusOnWindow.bind(this); 30 + this.windowMoveStart = this.windowMoveStart.bind(this); 31 + } 32 + // SIGNALS 33 + $activeWindow = signal( 34 + /** @type {string | null} */ 35 + null 36 + ); 37 + #lastZindex = 1e3; 38 + // LIFECYCLE 39 + /** 40 + * @override 41 + */ 42 + async connectedCallback() { 43 + super.connectedCallback(); 44 + this.root().addEventListener("mousedown", this.focusOnWindow); 45 + this.root().addEventListener("dtw-window-start-move", this.windowMoveStart); 46 + document.body.addEventListener( 47 + "mousedown", 48 + this.bringWebampToFront.bind(this) 49 + ); 50 + this.effect(() => { 51 + const activeId = this.$activeWindow.value; 52 + this.setWindowStatuses(activeId); 53 + }); 54 + } 55 + /** 56 + * @override 57 + */ 58 + disconnectedCallback() { 59 + super.disconnectedCallback(); 60 + this.root().removeEventListener("mousedown", this.focusOnWindow); 61 + this.root().removeEventListener("dtw-window-start-move", this.windowMoveStart); 62 + document.body.removeEventListener( 63 + "mousedown", 64 + this.bringWebampToFront.bind(this) 65 + ); 66 + } 67 + /** 68 + * @param {MouseEvent} event 69 + */ 70 + bringWebampToFront(event) { 71 + if (event.target instanceof HTMLElement) { 72 + const webamp = event.target?.closest("#webamp"); 73 + if (webamp instanceof HTMLElement) { 74 + this.#lastZindex++; 75 + webamp.style.zIndex = this.#lastZindex.toString(); 76 + } 77 + } 78 + } 79 + /** 80 + * @param {Event} event 81 + */ 82 + focusOnWindow(event) { 83 + if (event.target instanceof HTMLElement) { 84 + const win = event.target?.closest("dtw-window"); 85 + if (win instanceof HTMLElement === false) return; 86 + if (win.id) this.$activeWindow.value = win.id; 87 + this.#lastZindex++; 88 + win.style.zIndex = this.#lastZindex.toString(); 89 + } 90 + } 91 + /** 92 + * @param {string | null} activeId 93 + */ 94 + async setWindowStatuses(activeId) { 95 + await customElements.whenDefined("dtw-window"); 96 + this.activateWindow(activeId); 97 + } 98 + /** 99 + * @param {any} ogEvent 100 + */ 101 + windowMoveStart(ogEvent) { 102 + const moveFn = debounceMicrotask((event) => { 103 + if (event instanceof MouseEvent) { 104 + const x = event.x - ogEvent.detail.xElement; 105 + const y = event.y - ogEvent.detail.yElement; 106 + const target = ogEvent.detail.element; 107 + if (target) { 108 + target.style.left = `${x}px`; 109 + target.style.top = `${y}px`; 110 + } 111 + } 112 + }, { 113 + updateArguments: true 114 + }); 115 + const stopMove = /* @__PURE__ */ __name(() => { 116 + document.removeEventListener("mousemove", moveFn); 117 + document.removeEventListener("mouseup", stopMove); 118 + document.removeEventListener("mouseleave", stopMove); 119 + }, "stopMove"); 120 + document.addEventListener("mousemove", moveFn); 121 + document.addEventListener("mouseup", stopMove); 122 + document.addEventListener("mouseleave", stopMove); 123 + } 124 + // ACTIONS 125 + /** 126 + * @param {string | null} activeId 127 + */ 128 + activateWindow(activeId) { 129 + this.querySelectorAll("dtw-window").forEach((w) => { 130 + if (w instanceof element_default === false) return; 131 + if (activeId && w.id === activeId) { 132 + w.activate(); 133 + } else { 134 + w.deactivate(); 135 + } 136 + }); 137 + } 138 + /** 139 + * @param {string} id 140 + */ 141 + toggleWindow(id) { 142 + const w = this.querySelector(`dtw-window#${id}`); 143 + if (w instanceof element_default === false) return; 144 + w.toggleAttribute("open"); 145 + if (w.hasAttribute("open")) { 146 + this.activateWindow(id); 147 + this.#lastZindex++; 148 + w.style.zIndex = this.#lastZindex.toString(); 149 + } 150 + } 151 + // RENDER 152 + /** 153 + * @param {RenderArg} _ 154 + */ 155 + render({ html }) { 156 + return html` 157 + <style> 158 + :host { 159 + user-select: none; 160 + } 161 + </style> 162 + 163 + <slot></slot> 164 + `; 165 + } 166 + }; 167 + var element_default2 = WindowManager; 168 + var CLASS = WindowManager; 169 + var NAME = "dtw-window-manager"; 170 + customElements.define(NAME, WindowManager); 171 + 172 + export { 173 + element_default2 as element_default, 174 + CLASS, 175 + NAME 176 + }; 177 + 178 + //# sourceMappingURL=./chunk-DH43DE2O.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-DH43DE2O.js.map
··· 1 + {"version":3,"sources":["/themes/webamp/window-manager/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\nimport { debounceMicrotask } from \"@vicary/debounce-microtask\";\n\nimport WindowElement from \"../window/element.js\"\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass WindowManager extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n\n this.focusOnWindow = this.focusOnWindow.bind(this)\n this.windowMoveStart = this.windowMoveStart.bind(this)\n }\n\n // SIGNALS\n\n $activeWindow = signal(/** @type {string | null} */ (null));\n #lastZindex = 1000;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\n\n // Events\n this.root().addEventListener(\"mousedown\", this.focusOnWindow);\n this.root().addEventListener(\"dtw-window-start-move\", this.windowMoveStart);\n\n // Webamp stuff\n document.body.addEventListener(\n \"mousedown\",\n this.bringWebampToFront.bind(this),\n );\n\n // React to active window changing\n this.effect(() => {\n const activeId = this.$activeWindow.value;\n this.setWindowStatuses(activeId);\n });\n }\n\n /**\n * @override\n */\n disconnectedCallback() {\n super.disconnectedCallback();\n\n this.root().removeEventListener(\"mousedown\", this.focusOnWindow);\n this.root().removeEventListener(\"dtw-window-start-move\", this.windowMoveStart);\n\n document.body.removeEventListener(\n \"mousedown\",\n this.bringWebampToFront.bind(this),\n );\n }\n\n /**\n * @param {MouseEvent} event\n */\n bringWebampToFront(event) {\n if (event.target instanceof HTMLElement) {\n const webamp = event.target?.closest(\"#webamp\");\n if (webamp instanceof HTMLElement) {\n this.#lastZindex++;\n webamp.style.zIndex = this.#lastZindex.toString();\n }\n }\n }\n\n /**\n * @param {Event} event\n */\n focusOnWindow(event) {\n if (event.target instanceof HTMLElement) {\n const win = event.target?.closest(\"dtw-window\");\n if (win instanceof HTMLElement === false) return;\n if (win.id) this.$activeWindow.value = win.id;\n\n this.#lastZindex++;\n win.style.zIndex = this.#lastZindex.toString();\n }\n }\n\n /**\n * @param {string | null} activeId\n */\n async setWindowStatuses(activeId) {\n await customElements.whenDefined(\"dtw-window\");\n this.activateWindow(activeId)\n }\n\n /**\n * @param {any} ogEvent\n */\n windowMoveStart(ogEvent) {\n /**\n * @param {Event} event\n */\n const moveFn = debounceMicrotask((event) => {\n if (event instanceof MouseEvent) {\n const x = event.x - ogEvent.detail.xElement;\n const y = event.y - ogEvent.detail.yElement;\n const target = ogEvent.detail.element;\n\n if (target) {\n target.style.left = `${x}px`;\n target.style.top = `${y}px`;\n }\n }\n }, {\n updateArguments: true,\n });\n\n const stopMove = () => {\n document.removeEventListener(\"mousemove\", moveFn);\n document.removeEventListener(\"mouseup\", stopMove);\n document.removeEventListener(\"mouseleave\", stopMove);\n };\n\n document.addEventListener(\"mousemove\", moveFn);\n document.addEventListener(\"mouseup\", stopMove);\n document.addEventListener(\"mouseleave\", stopMove);\n }\n\n // ACTIONS\n\n /**\n * @param {string | null} activeId\n */\n activateWindow(activeId) {\n this.querySelectorAll(\"dtw-window\").forEach(w => {\n if (w instanceof WindowElement === false) return\n\n if (activeId && w.id === activeId) {\n w.activate();\n } else {\n w.deactivate();\n }\n })\n }\n\n /**\n * @param {string} id\n */\n toggleWindow(id) {\n const w = this.querySelector(`dtw-window#${id}`)\n if (w instanceof WindowElement === false) return\n\n w.toggleAttribute(\"open\")\n\n if (w.hasAttribute(\"open\")) {\n this.activateWindow(id)\n this.#lastZindex++;\n w.style.zIndex = this.#lastZindex.toString();\n }\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <style>\n :host {\n user-select: none;\n }\n </style>\n\n <slot></slot>\n `;\n }\n}\n\nexport default WindowManager;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = WindowManager;\nexport const NAME = \"dtw-window-manager\";\n\ncustomElements.define(NAME, WindowManager);\n"],"mappings":"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","names":["element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-DH43DE2O.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-DUCTMCPX.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-DUCTMCPX.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-DUCTMCPX.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-DUCTMCPX.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EEUCFWD4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EEUCFWD4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EEVL24MR.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEVL24MR.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EEVL24MR.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEVL24MR.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EJ2QF5QE.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EJ2QF5QE.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EJ2QF5QE.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EJ2QF5QE.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EPB7MNYY.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-EPB7MNYY.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EPB7MNYY.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-EPB7MNYY.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-ERP4MUHU.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-ERP4MUHU.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-ERP4MUHU.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-ERP4MUHU.js.map
+81
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-ETCOFMH2.js
··· 1 + import { 2 + BroadcastableDiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + signal 6 + } from "./chunk-IZOBPV2S.js"; 7 + import { 8 + __name, 9 + init_Buffer, 10 + init_process 11 + } from "./chunk-FZQXS3RE.js"; 12 + 13 + // components/engine/scope/element.js 14 + init_Buffer(); 15 + init_process(); 16 + var ScopeEngine = class extends BroadcastableDiffuseElement { 17 + static { 18 + __name(this, "ScopeEngine"); 19 + } 20 + static NAME = "diffuse/engine/scope"; 21 + // SIGNALS 22 + #playlistId = signal( 23 + /** @type {string | undefined} */ 24 + void 0 25 + ); 26 + #searchTerm = signal( 27 + /** @type {string | undefined} */ 28 + void 0 29 + ); 30 + playlistId = this.#playlistId.get; 31 + searchTerm = this.#searchTerm.get; 32 + // LIFECYCLE 33 + /** 34 + * @override 35 + */ 36 + connectedCallback() { 37 + if (this.hasAttribute("group")) { 38 + const actions = this.broadcast(this.nameWithGroup, { 39 + setPlaylistId: { strategy: "replicate", fn: this.setPlaylistId }, 40 + setSearchTerm: { strategy: "replicate", fn: this.setSearchTerm } 41 + }); 42 + if (actions) { 43 + this.setPlaylistId = actions.setPlaylistId; 44 + this.setSearchTerm = actions.setSearchTerm; 45 + } 46 + } 47 + super.connectedCallback(); 48 + const storagePrefix = `${this.constructor.prototype.constructor.NAME}/${this.group}/`; 49 + this.#playlistId.value = localStorage.getItem(`${storagePrefix}/playlistId`) ?? void 0; 50 + this.#searchTerm.value = localStorage.getItem(`${storagePrefix}/searchTerm`) ?? void 0; 51 + this.effect(() => { 52 + const key = `${storagePrefix}/playlistId`; 53 + const val = this.#playlistId.value; 54 + if (val) localStorage.setItem(key, val); 55 + else localStorage.removeItem(key); 56 + }); 57 + this.effect(() => { 58 + const key = `${storagePrefix}/searchTerm`; 59 + const val = this.#searchTerm.value; 60 + if (val) localStorage.setItem(key, val); 61 + else localStorage.removeItem(key); 62 + }); 63 + } 64 + // ACTIONS 65 + /** @param {string | undefined} val */ 66 + setPlaylistId = /* @__PURE__ */ __name(async (val) => this.#playlistId.value = val, "setPlaylistId"); 67 + /** @param {string | undefined} val */ 68 + setSearchTerm = /* @__PURE__ */ __name(async (val) => this.#searchTerm.value = val, "setSearchTerm"); 69 + }; 70 + var element_default = ScopeEngine; 71 + var CLASS = ScopeEngine; 72 + var NAME = "de-scope"; 73 + customElements.define(NAME, CLASS); 74 + 75 + export { 76 + element_default, 77 + CLASS, 78 + NAME 79 + }; 80 + 81 + //# sourceMappingURL=./chunk-ETCOFMH2.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-ETCOFMH2.js.map
··· 1 + {"version":3,"sources":["/components/engine/scope/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass ScopeEngine extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/engine/scope\";\n\n // SIGNALS\n\n #playlistId = signal(/** @type {string | undefined} */ (undefined));\n #searchTerm = signal(/** @type {string | undefined} */ (undefined));\n\n playlistId = this.#playlistId.get;\n searchTerm = this.#searchTerm.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n setPlaylistId: { strategy: \"replicate\", fn: this.setPlaylistId },\n setSearchTerm: { strategy: \"replicate\", fn: this.setSearchTerm },\n });\n\n if (actions) {\n this.setPlaylistId = actions.setPlaylistId;\n this.setSearchTerm = actions.setSearchTerm;\n }\n }\n\n // Super\n super.connectedCallback();\n\n // Signals\n const storagePrefix =\n `${this.constructor.prototype.constructor.NAME}/${this.group}/`;\n\n this.#playlistId.value =\n localStorage.getItem(`${storagePrefix}/playlistId`) ?? undefined;\n this.#searchTerm.value =\n localStorage.getItem(`${storagePrefix}/searchTerm`) ?? undefined;\n\n // Effects\n this.effect(() => {\n const key = `${storagePrefix}/playlistId`;\n const val = this.#playlistId.value;\n\n if (val) localStorage.setItem(key, val);\n else localStorage.removeItem(key);\n });\n\n this.effect(() => {\n const key = `${storagePrefix}/searchTerm`;\n const val = this.#searchTerm.value;\n\n if (val) localStorage.setItem(key, val);\n else localStorage.removeItem(key);\n });\n }\n\n // ACTIONS\n\n /** @param {string | undefined} val */\n setPlaylistId = async (val) => this.#playlistId.value = val;\n\n /** @param {string | undefined} val */\n setSearchTerm = async (val) => this.#searchTerm.value = val;\n}\n\nexport default ScopeEngine;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ScopeEngine;\nexport const NAME = \"de-scope\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAOA,IAAM,cAAN,cAA0B,4BAA4B;AAAA,EAPtD,OAOsD;AAAA;AAAA;AAAA,EACpD,OAAO,OAAO;AAAA;AAAA,EAId,cAAc;AAAA;AAAA,IAA0C;AAAA,EAAU;AAAA,EAClE,cAAc;AAAA;AAAA,IAA0C;AAAA,EAAU;AAAA,EAElE,aAAa,KAAK,YAAY;AAAA,EAC9B,aAAa,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B,oBAAoB;AAElB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,YAAM,UAAU,KAAK,UAAU,KAAK,eAAe;AAAA,QACjD,eAAe,EAAE,UAAU,aAAa,IAAI,KAAK,cAAc;AAAA,QAC/D,eAAe,EAAE,UAAU,aAAa,IAAI,KAAK,cAAc;AAAA,MACjE,CAAC;AAED,UAAI,SAAS;AACX,aAAK,gBAAgB,QAAQ;AAC7B,aAAK,gBAAgB,QAAQ;AAAA,MAC/B;AAAA,IACF;AAGA,UAAM,kBAAkB;AAGxB,UAAM,gBACJ,GAAG,KAAK,YAAY,UAAU,YAAY,IAAI,IAAI,KAAK,KAAK;AAE9D,SAAK,YAAY,QACf,aAAa,QAAQ,GAAG,aAAa,aAAa,KAAK;AACzD,SAAK,YAAY,QACf,aAAa,QAAQ,GAAG,aAAa,aAAa,KAAK;AAGzD,SAAK,OAAO,MAAM;AAChB,YAAM,MAAM,GAAG,aAAa;AAC5B,YAAM,MAAM,KAAK,YAAY;AAE7B,UAAI,IAAK,cAAa,QAAQ,KAAK,GAAG;AAAA,UACjC,cAAa,WAAW,GAAG;AAAA,IAClC,CAAC;AAED,SAAK,OAAO,MAAM;AAChB,YAAM,MAAM,GAAG,aAAa;AAC5B,YAAM,MAAM,KAAK,YAAY;AAE7B,UAAI,IAAK,cAAa,QAAQ,KAAK,GAAG;AAAA,UACjC,cAAa,WAAW,GAAG;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,gBAAgB,8BAAO,QAAQ,KAAK,YAAY,QAAQ,KAAxC;AAAA;AAAA,EAGhB,gBAAgB,8BAAO,QAAQ,KAAK,YAAY,QAAQ,KAAxC;AAClB;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-ETCOFMH2.js.map"}
+195
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EXNT6GPY.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + computed, 6 + signal 7 + } from "./chunk-IZOBPV2S.js"; 8 + import { 9 + __name, 10 + init_Buffer, 11 + init_process 12 + } from "./chunk-FZQXS3RE.js"; 13 + 14 + // components/configurator/output-fallback/element.js 15 + init_Buffer(); 16 + init_process(); 17 + var OutputFallbackConfigurator = class extends DiffuseElement { 18 + static { 19 + __name(this, "OutputFallbackConfigurator"); 20 + } 21 + static NAME = "diffuse/configurator/output-fallback"; 22 + constructor() { 23 + super(); 24 + const manager = { 25 + facets: { 26 + collection: computed(() => { 27 + return this.#activeOutput.value?.facets.collection(); 28 + }), 29 + reload: /* @__PURE__ */ __name(() => { 30 + const out = this.#activeOutput.value; 31 + if (out) return out.facets.reload(); 32 + return Promise.resolve(); 33 + }, "reload"), 34 + save: /* @__PURE__ */ __name(async (newFacets) => { 35 + if (newFacets !== void 0) { 36 + await Promise.all( 37 + this.#outputs.map((o) => o.facets.save(newFacets)) 38 + ); 39 + } 40 + }, "save"), 41 + state: computed(() => { 42 + return this.#activeOutput.value?.facets.state() ?? "sleeping"; 43 + }) 44 + }, 45 + playlists: { 46 + collection: computed(() => { 47 + return this.#activeOutput.value?.playlists.collection(); 48 + }), 49 + reload: /* @__PURE__ */ __name(() => { 50 + const out = this.#activeOutput.value; 51 + if (out) return out.playlists.reload(); 52 + return Promise.resolve(); 53 + }, "reload"), 54 + save: /* @__PURE__ */ __name(async (newPlaylists) => { 55 + if (newPlaylists !== void 0) { 56 + await Promise.all( 57 + this.#outputs.map((o) => o.playlists.save(newPlaylists)) 58 + ); 59 + } 60 + }, "save"), 61 + state: computed(() => { 62 + return this.#activeOutput.value?.playlists.state() ?? "sleeping"; 63 + }) 64 + }, 65 + themes: { 66 + collection: computed(() => { 67 + return this.#activeOutput.value?.themes.collection(); 68 + }), 69 + reload: /* @__PURE__ */ __name(() => { 70 + const out = this.#activeOutput.value; 71 + if (out) return out.themes.reload(); 72 + return Promise.resolve(); 73 + }, "reload"), 74 + save: /* @__PURE__ */ __name(async (newThemes) => { 75 + if (newThemes !== void 0) { 76 + await Promise.all( 77 + this.#outputs.map((o) => o.themes.save(newThemes)) 78 + ); 79 + } 80 + }, "save"), 81 + state: computed(() => { 82 + return this.#activeOutput.value?.themes.state() ?? "sleeping"; 83 + }) 84 + }, 85 + tracks: { 86 + collection: computed(() => { 87 + return this.#activeOutput.value?.tracks.collection(); 88 + }), 89 + reload: /* @__PURE__ */ __name(() => { 90 + const out = this.#activeOutput.value; 91 + if (out) return out.tracks.reload(); 92 + return Promise.resolve(); 93 + }, "reload"), 94 + save: /* @__PURE__ */ __name(async (newTracks) => { 95 + if (newTracks !== void 0) { 96 + await Promise.all( 97 + this.#outputs.map((o) => o.tracks.save(newTracks)) 98 + ); 99 + } 100 + }, "save"), 101 + state: computed(() => { 102 + return this.#activeOutput.value?.tracks.state() ?? "sleeping"; 103 + }) 104 + }, 105 + // Other 106 + ready: computed(() => { 107 + if (this.#activeOutput.value) return true; 108 + return this.#setupFinished.value; 109 + }) 110 + }; 111 + this.facets = manager.facets; 112 + this.playlists = manager.playlists; 113 + this.themes = manager.themes; 114 + this.tracks = manager.tracks; 115 + this.ready = manager.ready; 116 + this.effect(this.#setActiveOutput); 117 + } 118 + #setActiveOutput = /* @__PURE__ */ __name(() => { 119 + const _trigger = this.#setupFinished.value; 120 + let activeOutput = null; 121 + for (const output of this.#outputs) { 122 + if (output.ready()) { 123 + activeOutput = output; 124 + break; 125 + } 126 + } 127 + this.#activeOutput.value = activeOutput; 128 + }, "#setActiveOutput"); 129 + // SIGNALS 130 + #activeOutput = signal( 131 + /** @type {OutputElement<Encoding> | null} */ 132 + null 133 + ); 134 + #setupFinished = signal(false); 135 + // STATE 136 + #outputs = ( 137 + /** @type {OutputElement<Encoding>[]} */ 138 + [] 139 + ); 140 + activeOutput = this.#activeOutput.get; 141 + // LIFECYCLE 142 + /** 143 + * @override 144 + */ 145 + async connectedCallback() { 146 + super.connectedCallback(); 147 + const children = Array.from(this.root().children); 148 + const outputs = []; 149 + for (const el of children) { 150 + await customElements.whenDefined(el.localName); 151 + if ("nameWithGroup" in el && "tracks" in el) { 152 + outputs.push( 153 + /** @type {OutputElement<Encoding>} */ 154 + /** @type {unknown} */ 155 + el 156 + ); 157 + } 158 + } 159 + this.#outputs = outputs; 160 + this.#setupFinished.value = true; 161 + } 162 + // MISC 163 + /** 164 + * @override 165 + */ 166 + dependencies = /* @__PURE__ */ __name(() => { 167 + return Object.fromEntries( 168 + Array.from(this.root().children).flatMap((element) => { 169 + if (element.hasAttribute("id") === false) { 170 + console.warn( 171 + "Missing `id` for output-fallback configurator child element with `localName` '" + element.localName + "'" 172 + ); 173 + return []; 174 + } 175 + const d = ( 176 + /** @type {DiffuseElement} */ 177 + element 178 + ); 179 + return [[d.id, d]]; 180 + }) 181 + ); 182 + }, "dependencies"); 183 + }; 184 + var element_default = OutputFallbackConfigurator; 185 + var CLASS = OutputFallbackConfigurator; 186 + var NAME = "dc-output-fallback"; 187 + customElements.define(NAME, CLASS); 188 + 189 + export { 190 + element_default, 191 + CLASS, 192 + NAME 193 + }; 194 + 195 + //# sourceMappingURL=./chunk-EXNT6GPY.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-EXNT6GPY.js.map
··· 1 + {"version":3,"sources":["/components/configurator/output-fallback/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { computed, signal } from \"@common/signal.js\";\n\n/**\n * @import {OutputManagerDeputy, OutputElement} from \"@components/output/types.d.ts\"\n * @import {OutputFallbackConfiguratorElement} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * Output fallback configurator.\n *\n * Checks child output elements in order and delegates\n * to the first one whose `.ready()` signal returns `true`.\n *\n * @template [Encoding=null]\n * @implements {OutputManagerDeputy<Encoding | undefined>}\n * @implements {OutputFallbackConfiguratorElement<Encoding>}\n */\nclass OutputFallbackConfigurator extends DiffuseElement {\n static NAME = \"diffuse/configurator/output-fallback\";\n\n constructor() {\n super();\n\n /** @type {OutputManagerDeputy<Encoding | undefined>} */\n const manager = {\n facets: {\n collection: computed(() => {\n return this.#activeOutput.value?.facets.collection();\n }),\n reload: () => {\n const out = this.#activeOutput.value;\n if (out) return out.facets.reload();\n return Promise.resolve();\n },\n save: async (newFacets) => {\n if (newFacets !== undefined) {\n await Promise.all(\n this.#outputs.map((o) => o.facets.save(newFacets)),\n );\n }\n },\n state: computed(() => {\n return this.#activeOutput.value?.facets.state() ?? \"sleeping\";\n }),\n },\n playlists: {\n collection: computed(() => {\n return this.#activeOutput.value?.playlists.collection();\n }),\n reload: () => {\n const out = this.#activeOutput.value;\n if (out) return out.playlists.reload();\n return Promise.resolve();\n },\n save: async (newPlaylists) => {\n if (newPlaylists !== undefined) {\n await Promise.all(\n this.#outputs.map((o) => o.playlists.save(newPlaylists)),\n );\n }\n },\n state: computed(() => {\n return this.#activeOutput.value?.playlists.state() ?? \"sleeping\";\n }),\n },\n themes: {\n collection: computed(() => {\n return this.#activeOutput.value?.themes.collection();\n }),\n reload: () => {\n const out = this.#activeOutput.value;\n if (out) return out.themes.reload();\n return Promise.resolve();\n },\n save: async (newThemes) => {\n if (newThemes !== undefined) {\n await Promise.all(\n this.#outputs.map((o) => o.themes.save(newThemes)),\n );\n }\n },\n state: computed(() => {\n return this.#activeOutput.value?.themes.state() ?? \"sleeping\";\n }),\n },\n tracks: {\n collection: computed(() => {\n return this.#activeOutput.value?.tracks.collection();\n }),\n reload: () => {\n const out = this.#activeOutput.value;\n if (out) return out.tracks.reload();\n return Promise.resolve();\n },\n save: async (newTracks) => {\n if (newTracks !== undefined) {\n await Promise.all(\n this.#outputs.map((o) => o.tracks.save(newTracks)),\n );\n }\n },\n state: computed(() => {\n return this.#activeOutput.value?.tracks.state() ?? \"sleeping\";\n }),\n },\n\n // Other\n ready: computed(() => {\n if (this.#activeOutput.value) return true;\n return this.#setupFinished.value;\n }),\n };\n\n this.facets = manager.facets;\n this.playlists = manager.playlists;\n this.themes = manager.themes;\n this.tracks = manager.tracks;\n this.ready = manager.ready;\n\n this.effect(this.#setActiveOutput);\n }\n\n #setActiveOutput = () => {\n const _trigger = this.#setupFinished.value;\n\n /** @type {OutputElement<Encoding> | null} */\n let activeOutput = null;\n\n for (const output of this.#outputs) {\n if (output.ready()) {\n activeOutput = output;\n break;\n }\n }\n\n this.#activeOutput.value = activeOutput;\n };\n\n // SIGNALS\n\n #activeOutput = signal(/** @type {OutputElement<Encoding> | null} */ (null));\n #setupFinished = signal(false);\n\n // STATE\n\n #outputs = /** @type {OutputElement<Encoding>[]} */ ([]);\n\n activeOutput = this.#activeOutput.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\n\n const children = Array.from(this.root().children);\n\n /** @type {OutputElement<Encoding>[]} */\n const outputs = [];\n\n for (const el of children) {\n await customElements.whenDefined(el.localName);\n\n if (\"nameWithGroup\" in el && \"tracks\" in el) {\n outputs.push(\n /** @type {OutputElement<Encoding>} */ (/** @type {unknown} */ (el)),\n );\n }\n }\n\n this.#outputs = outputs;\n this.#setupFinished.value = true;\n }\n\n // MISC\n\n /**\n * @override\n */\n dependencies = () => {\n return Object.fromEntries(\n Array.from(this.root().children).flatMap((element) => {\n if (element.hasAttribute(\"id\") === false) {\n console.warn(\n \"Missing `id` for output-fallback configurator child element with `localName` '\" +\n element.localName + \"'\",\n );\n return [];\n }\n\n const d = /** @type {DiffuseElement} */ (element);\n return [[d.id, d]];\n }),\n );\n };\n}\n\nexport default OutputFallbackConfigurator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = OutputFallbackConfigurator;\nexport const NAME = \"dc-output-fallback\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-EXNT6GPY.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FAW4EB7G.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FAW4EB7G.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js.map
+15
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js
··· 1 + import { 2 + init_Buffer, 3 + init_process 4 + } from "./chunk-FZQXS3RE.js"; 5 + 6 + // components/output/bytes/s3/constants.js 7 + init_Buffer(); 8 + init_process(); 9 + var OBJECT_PREFIX = "diffuse/output/bytes/s3/"; 10 + 11 + export { 12 + OBJECT_PREFIX 13 + }; 14 + 15 + //# sourceMappingURL=./chunk-FPIXTJ7E.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js.map
··· 1 + {"version":3,"sources":["/components/output/bytes/s3/constants.js"],"sourcesContent":["export const OBJECT_PREFIX = \"diffuse/output/bytes/s3/\";\n"],"mappings":";;;;;;AAAA;AAAA;AAAO,IAAM,gBAAgB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-FPIXTJ7E.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FZQXS3RE.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FZQXS3RE.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-G2ZO6QIY.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G2ZO6QIY.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-G2ZO6QIY.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G2ZO6QIY.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-G56PUJUJ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-G56PUJUJ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js.map
+58
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-GTZIAKZS.js
··· 1 + import { 2 + buildURI, 3 + serversFromTracks 4 + } from "./chunk-AGNDISJF.js"; 5 + import { 6 + SCHEME 7 + } from "./chunk-EEUCFWD4.js"; 8 + import { 9 + DiffuseElement 10 + } from "./chunk-H46AZIKM.js"; 11 + import { 12 + __name, 13 + init_Buffer, 14 + init_process 15 + } from "./chunk-FZQXS3RE.js"; 16 + 17 + // components/input/opensubsonic/element.js 18 + init_Buffer(); 19 + init_process(); 20 + var OpensubsonicInput = class extends DiffuseElement { 21 + static { 22 + __name(this, "OpensubsonicInput"); 23 + } 24 + static NAME = "diffuse/input/opensubsonic"; 25 + static WORKER_URL = "components/input/opensubsonic/worker.js"; 26 + SCHEME = SCHEME; 27 + constructor() { 28 + super(); 29 + this.proxy = this.workerProxy(); 30 + this.consult = this.proxy.consult; 31 + this.detach = this.proxy.detach; 32 + this.groupConsult = this.proxy.groupConsult; 33 + this.list = this.proxy.list; 34 + this.resolve = this.proxy.resolve; 35 + } 36 + // 🛠️ 37 + /** @param {Track[]} tracks */ 38 + sources(tracks) { 39 + return Object.values(serversFromTracks(tracks)).map((server) => { 40 + return { 41 + label: `${server.host} (${server.username ?? server.apiKey})`, 42 + uri: buildURI(server) 43 + }; 44 + }); 45 + } 46 + }; 47 + var element_default = OpensubsonicInput; 48 + var CLASS = OpensubsonicInput; 49 + var NAME = "di-opensubsonic"; 50 + customElements.define(NAME, CLASS); 51 + 52 + export { 53 + element_default, 54 + CLASS, 55 + NAME 56 + }; 57 + 58 + //# sourceMappingURL=./chunk-GTZIAKZS.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-GTZIAKZS.js.map
··· 1 + {"version":3,"sources":["/components/input/opensubsonic/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { SCHEME } from \"./constants.js\";\nimport { buildURI, serversFromTracks } from \"./common.js\";\n\n/**\n * @import {InputActions, InputSchemeProvider} from \"@components/input/types.d.ts\"\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<InputActions>}\n * @implements {InputSchemeProvider}\n */\nclass OpensubsonicInput extends DiffuseElement {\n static NAME = \"diffuse/input/opensubsonic\";\n static WORKER_URL = \"components/input/opensubsonic/worker.js\";\n\n SCHEME = SCHEME;\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<InputActions>} */\n this.proxy = this.workerProxy();\n\n this.consult = this.proxy.consult;\n this.detach = this.proxy.detach;\n this.groupConsult = this.proxy.groupConsult;\n this.list = this.proxy.list;\n this.resolve = this.proxy.resolve;\n }\n\n // 🛠️\n\n /** @param {Track[]} tracks */\n sources(tracks) {\n return Object.values(serversFromTracks(tracks)).map((server) => {\n return {\n label: `${server.host} (${server.username ?? server.apiKey})`,\n uri: buildURI(server),\n };\n });\n }\n}\n\nexport default OpensubsonicInput;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = OpensubsonicInput;\nexport const NAME = \"di-opensubsonic\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAkBA,IAAM,oBAAN,cAAgC,eAAe;AAAA,EAlB/C,OAkB+C;AAAA;AAAA;AAAA,EAC7C,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,SAAS;AAAA,EAET,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,KAAK,YAAY;AAE9B,SAAK,UAAU,KAAK,MAAM;AAC1B,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,eAAe,KAAK,MAAM;AAC/B,SAAK,OAAO,KAAK,MAAM;AACvB,SAAK,UAAU,KAAK,MAAM;AAAA,EAC5B;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAQ;AACd,WAAO,OAAO,OAAO,kBAAkB,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW;AAC9D,aAAO;AAAA,QACL,OAAO,GAAG,OAAO,IAAI,KAAK,OAAO,YAAY,OAAO,MAAM;AAAA,QAC1D,KAAK,SAAS,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-GTZIAKZS.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-GX3WPNEX.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-GX3WPNEX.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js.map
+742
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-H46AZIKM.js
··· 1 + import { 2 + query_string_default 3 + } from "./chunk-G56PUJUJ.js"; 4 + import { 5 + effect, 6 + signal 7 + } from "./chunk-IZOBPV2S.js"; 8 + import { 9 + RPCChannel, 10 + decodeMessage, 11 + encodeMessage, 12 + rpc, 13 + workerLink, 14 + workerProxy, 15 + workerTunnel 16 + } from "./chunk-EJ2QF5QE.js"; 17 + import { 18 + BrowserPostMessageIo 19 + } from "./chunk-NCFHYTLD.js"; 20 + import { 21 + __name, 22 + init_Buffer, 23 + init_process 24 + } from "./chunk-FZQXS3RE.js"; 25 + 26 + // common/element.js 27 + init_Buffer(); 28 + init_process(); 29 + 30 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/lit-html.js 31 + init_Buffer(); 32 + init_process(); 33 + var t = globalThis; 34 + var i = /* @__PURE__ */ __name((t2) => t2, "i"); 35 + var s = t.trustedTypes; 36 + var e = s ? s.createPolicy("lit-html", { createHTML: /* @__PURE__ */ __name((t2) => t2, "createHTML") }) : void 0; 37 + var h = "$lit$"; 38 + var o = `lit$${Math.random().toFixed(9).slice(2)}$`; 39 + var n = "?" + o; 40 + var r = `<${n}>`; 41 + var l = void 0 === t.document ? { createTreeWalker: /* @__PURE__ */ __name(() => ({}), "createTreeWalker") } : document; 42 + var c = /* @__PURE__ */ __name(() => l.createComment(""), "c"); 43 + var a = /* @__PURE__ */ __name((t2) => null === t2 || "object" != typeof t2 && "function" != typeof t2, "a"); 44 + var u = Array.isArray; 45 + var d = /* @__PURE__ */ __name((t2) => u(t2) || "function" == typeof t2?.[Symbol.iterator], "d"); 46 + var f = "[ \n\f\r]"; 47 + var v = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g; 48 + var _ = /-->/g; 49 + var m = />/g; 50 + var p = RegExp(`>|${f}(?:([^\\s"'>=/]+)(${f}*=${f}*(?:[^ 51 + \f\r"'\`<>=]|("|')|))|$)`, "g"); 52 + var g = /'/g; 53 + var $ = /"/g; 54 + var y = /^(?:script|style|textarea|title)$/i; 55 + var x = /* @__PURE__ */ __name((t2) => (i2, ...s2) => ({ _$litType$: t2, strings: i2, values: s2 }), "x"); 56 + var T = x(1); 57 + var b = x(2); 58 + var w = x(3); 59 + var E = /* @__PURE__ */ Symbol.for("lit-noChange"); 60 + var A = /* @__PURE__ */ Symbol.for("lit-nothing"); 61 + var C = /* @__PURE__ */ new WeakMap(); 62 + var P = l.createTreeWalker(l, 129); 63 + function V(t2, i2) { 64 + if (!u(t2) || !t2.hasOwnProperty("raw")) throw Error("invalid template strings array"); 65 + return void 0 !== e ? e.createHTML(i2) : i2; 66 + } 67 + __name(V, "V"); 68 + var N = /* @__PURE__ */ __name((t2, i2) => { 69 + const s2 = t2.length - 1, e2 = []; 70 + let n2, l2 = 2 === i2 ? "<svg>" : 3 === i2 ? "<math>" : "", c2 = v; 71 + for (let i3 = 0; i3 < s2; i3++) { 72 + const s3 = t2[i3]; 73 + let a2, u2, d2 = -1, f2 = 0; 74 + for (; f2 < s3.length && (c2.lastIndex = f2, u2 = c2.exec(s3), null !== u2); ) f2 = c2.lastIndex, c2 === v ? "!--" === u2[1] ? c2 = _ : void 0 !== u2[1] ? c2 = m : void 0 !== u2[2] ? (y.test(u2[2]) && (n2 = RegExp("</" + u2[2], "g")), c2 = p) : void 0 !== u2[3] && (c2 = p) : c2 === p ? ">" === u2[0] ? (c2 = n2 ?? v, d2 = -1) : void 0 === u2[1] ? d2 = -2 : (d2 = c2.lastIndex - u2[2].length, a2 = u2[1], c2 = void 0 === u2[3] ? p : '"' === u2[3] ? $ : g) : c2 === $ || c2 === g ? c2 = p : c2 === _ || c2 === m ? c2 = v : (c2 = p, n2 = void 0); 75 + const x2 = c2 === p && t2[i3 + 1].startsWith("/>") ? " " : ""; 76 + l2 += c2 === v ? s3 + r : d2 >= 0 ? (e2.push(a2), s3.slice(0, d2) + h + s3.slice(d2) + o + x2) : s3 + o + (-2 === d2 ? i3 : x2); 77 + } 78 + return [V(t2, l2 + (t2[s2] || "<?>") + (2 === i2 ? "</svg>" : 3 === i2 ? "</math>" : "")), e2]; 79 + }, "N"); 80 + var S = class _S { 81 + static { 82 + __name(this, "S"); 83 + } 84 + constructor({ strings: t2, _$litType$: i2 }, e2) { 85 + let r2; 86 + this.parts = []; 87 + let l2 = 0, a2 = 0; 88 + const u2 = t2.length - 1, d2 = this.parts, [f2, v2] = N(t2, i2); 89 + if (this.el = _S.createElement(f2, e2), P.currentNode = this.el.content, 2 === i2 || 3 === i2) { 90 + const t3 = this.el.content.firstChild; 91 + t3.replaceWith(...t3.childNodes); 92 + } 93 + for (; null !== (r2 = P.nextNode()) && d2.length < u2; ) { 94 + if (1 === r2.nodeType) { 95 + if (r2.hasAttributes()) for (const t3 of r2.getAttributeNames()) if (t3.endsWith(h)) { 96 + const i3 = v2[a2++], s2 = r2.getAttribute(t3).split(o), e3 = /([.?@])?(.*)/.exec(i3); 97 + d2.push({ type: 1, index: l2, name: e3[2], strings: s2, ctor: "." === e3[1] ? I : "?" === e3[1] ? L : "@" === e3[1] ? z : H }), r2.removeAttribute(t3); 98 + } else t3.startsWith(o) && (d2.push({ type: 6, index: l2 }), r2.removeAttribute(t3)); 99 + if (y.test(r2.tagName)) { 100 + const t3 = r2.textContent.split(o), i3 = t3.length - 1; 101 + if (i3 > 0) { 102 + r2.textContent = s ? s.emptyScript : ""; 103 + for (let s2 = 0; s2 < i3; s2++) r2.append(t3[s2], c()), P.nextNode(), d2.push({ type: 2, index: ++l2 }); 104 + r2.append(t3[i3], c()); 105 + } 106 + } 107 + } else if (8 === r2.nodeType) if (r2.data === n) d2.push({ type: 2, index: l2 }); 108 + else { 109 + let t3 = -1; 110 + for (; -1 !== (t3 = r2.data.indexOf(o, t3 + 1)); ) d2.push({ type: 7, index: l2 }), t3 += o.length - 1; 111 + } 112 + l2++; 113 + } 114 + } 115 + static createElement(t2, i2) { 116 + const s2 = l.createElement("template"); 117 + return s2.innerHTML = t2, s2; 118 + } 119 + }; 120 + function M(t2, i2, s2 = t2, e2) { 121 + if (i2 === E) return i2; 122 + let h2 = void 0 !== e2 ? s2._$Co?.[e2] : s2._$Cl; 123 + const o2 = a(i2) ? void 0 : i2._$litDirective$; 124 + return h2?.constructor !== o2 && (h2?._$AO?.(false), void 0 === o2 ? h2 = void 0 : (h2 = new o2(t2), h2._$AT(t2, s2, e2)), void 0 !== e2 ? (s2._$Co ??= [])[e2] = h2 : s2._$Cl = h2), void 0 !== h2 && (i2 = M(t2, h2._$AS(t2, i2.values), h2, e2)), i2; 125 + } 126 + __name(M, "M"); 127 + var k = class { 128 + static { 129 + __name(this, "k"); 130 + } 131 + constructor(t2, i2) { 132 + this._$AV = [], this._$AN = void 0, this._$AD = t2, this._$AM = i2; 133 + } 134 + get parentNode() { 135 + return this._$AM.parentNode; 136 + } 137 + get _$AU() { 138 + return this._$AM._$AU; 139 + } 140 + u(t2) { 141 + const { el: { content: i2 }, parts: s2 } = this._$AD, e2 = (t2?.creationScope ?? l).importNode(i2, true); 142 + P.currentNode = e2; 143 + let h2 = P.nextNode(), o2 = 0, n2 = 0, r2 = s2[0]; 144 + for (; void 0 !== r2; ) { 145 + if (o2 === r2.index) { 146 + let i3; 147 + 2 === r2.type ? i3 = new R(h2, h2.nextSibling, this, t2) : 1 === r2.type ? i3 = new r2.ctor(h2, r2.name, r2.strings, this, t2) : 6 === r2.type && (i3 = new W(h2, this, t2)), this._$AV.push(i3), r2 = s2[++n2]; 148 + } 149 + o2 !== r2?.index && (h2 = P.nextNode(), o2++); 150 + } 151 + return P.currentNode = l, e2; 152 + } 153 + p(t2) { 154 + let i2 = 0; 155 + for (const s2 of this._$AV) void 0 !== s2 && (void 0 !== s2.strings ? (s2._$AI(t2, s2, i2), i2 += s2.strings.length - 2) : s2._$AI(t2[i2])), i2++; 156 + } 157 + }; 158 + var R = class _R { 159 + static { 160 + __name(this, "R"); 161 + } 162 + get _$AU() { 163 + return this._$AM?._$AU ?? this._$Cv; 164 + } 165 + constructor(t2, i2, s2, e2) { 166 + this.type = 2, this._$AH = A, this._$AN = void 0, this._$AA = t2, this._$AB = i2, this._$AM = s2, this.options = e2, this._$Cv = e2?.isConnected ?? true; 167 + } 168 + get parentNode() { 169 + let t2 = this._$AA.parentNode; 170 + const i2 = this._$AM; 171 + return void 0 !== i2 && 11 === t2?.nodeType && (t2 = i2.parentNode), t2; 172 + } 173 + get startNode() { 174 + return this._$AA; 175 + } 176 + get endNode() { 177 + return this._$AB; 178 + } 179 + _$AI(t2, i2 = this) { 180 + t2 = M(this, t2, i2), a(t2) ? t2 === A || null == t2 || "" === t2 ? (this._$AH !== A && this._$AR(), this._$AH = A) : t2 !== this._$AH && t2 !== E && this._(t2) : void 0 !== t2._$litType$ ? this.$(t2) : void 0 !== t2.nodeType ? this.T(t2) : d(t2) ? this.k(t2) : this._(t2); 181 + } 182 + O(t2) { 183 + return this._$AA.parentNode.insertBefore(t2, this._$AB); 184 + } 185 + T(t2) { 186 + this._$AH !== t2 && (this._$AR(), this._$AH = this.O(t2)); 187 + } 188 + _(t2) { 189 + this._$AH !== A && a(this._$AH) ? this._$AA.nextSibling.data = t2 : this.T(l.createTextNode(t2)), this._$AH = t2; 190 + } 191 + $(t2) { 192 + const { values: i2, _$litType$: s2 } = t2, e2 = "number" == typeof s2 ? this._$AC(t2) : (void 0 === s2.el && (s2.el = S.createElement(V(s2.h, s2.h[0]), this.options)), s2); 193 + if (this._$AH?._$AD === e2) this._$AH.p(i2); 194 + else { 195 + const t3 = new k(e2, this), s3 = t3.u(this.options); 196 + t3.p(i2), this.T(s3), this._$AH = t3; 197 + } 198 + } 199 + _$AC(t2) { 200 + let i2 = C.get(t2.strings); 201 + return void 0 === i2 && C.set(t2.strings, i2 = new S(t2)), i2; 202 + } 203 + k(t2) { 204 + u(this._$AH) || (this._$AH = [], this._$AR()); 205 + const i2 = this._$AH; 206 + let s2, e2 = 0; 207 + for (const h2 of t2) e2 === i2.length ? i2.push(s2 = new _R(this.O(c()), this.O(c()), this, this.options)) : s2 = i2[e2], s2._$AI(h2), e2++; 208 + e2 < i2.length && (this._$AR(s2 && s2._$AB.nextSibling, e2), i2.length = e2); 209 + } 210 + _$AR(t2 = this._$AA.nextSibling, s2) { 211 + for (this._$AP?.(false, true, s2); t2 !== this._$AB; ) { 212 + const s3 = i(t2).nextSibling; 213 + i(t2).remove(), t2 = s3; 214 + } 215 + } 216 + setConnected(t2) { 217 + void 0 === this._$AM && (this._$Cv = t2, this._$AP?.(t2)); 218 + } 219 + }; 220 + var H = class { 221 + static { 222 + __name(this, "H"); 223 + } 224 + get tagName() { 225 + return this.element.tagName; 226 + } 227 + get _$AU() { 228 + return this._$AM._$AU; 229 + } 230 + constructor(t2, i2, s2, e2, h2) { 231 + this.type = 1, this._$AH = A, this._$AN = void 0, this.element = t2, this.name = i2, this._$AM = e2, this.options = h2, s2.length > 2 || "" !== s2[0] || "" !== s2[1] ? (this._$AH = Array(s2.length - 1).fill(new String()), this.strings = s2) : this._$AH = A; 232 + } 233 + _$AI(t2, i2 = this, s2, e2) { 234 + const h2 = this.strings; 235 + let o2 = false; 236 + if (void 0 === h2) t2 = M(this, t2, i2, 0), o2 = !a(t2) || t2 !== this._$AH && t2 !== E, o2 && (this._$AH = t2); 237 + else { 238 + const e3 = t2; 239 + let n2, r2; 240 + for (t2 = h2[0], n2 = 0; n2 < h2.length - 1; n2++) r2 = M(this, e3[s2 + n2], i2, n2), r2 === E && (r2 = this._$AH[n2]), o2 ||= !a(r2) || r2 !== this._$AH[n2], r2 === A ? t2 = A : t2 !== A && (t2 += (r2 ?? "") + h2[n2 + 1]), this._$AH[n2] = r2; 241 + } 242 + o2 && !e2 && this.j(t2); 243 + } 244 + j(t2) { 245 + t2 === A ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, t2 ?? ""); 246 + } 247 + }; 248 + var I = class extends H { 249 + static { 250 + __name(this, "I"); 251 + } 252 + constructor() { 253 + super(...arguments), this.type = 3; 254 + } 255 + j(t2) { 256 + this.element[this.name] = t2 === A ? void 0 : t2; 257 + } 258 + }; 259 + var L = class extends H { 260 + static { 261 + __name(this, "L"); 262 + } 263 + constructor() { 264 + super(...arguments), this.type = 4; 265 + } 266 + j(t2) { 267 + this.element.toggleAttribute(this.name, !!t2 && t2 !== A); 268 + } 269 + }; 270 + var z = class extends H { 271 + static { 272 + __name(this, "z"); 273 + } 274 + constructor(t2, i2, s2, e2, h2) { 275 + super(t2, i2, s2, e2, h2), this.type = 5; 276 + } 277 + _$AI(t2, i2 = this) { 278 + if ((t2 = M(this, t2, i2, 0) ?? A) === E) return; 279 + const s2 = this._$AH, e2 = t2 === A && s2 !== A || t2.capture !== s2.capture || t2.once !== s2.once || t2.passive !== s2.passive, h2 = t2 !== A && (s2 === A || e2); 280 + e2 && this.element.removeEventListener(this.name, this, s2), h2 && this.element.addEventListener(this.name, this, t2), this._$AH = t2; 281 + } 282 + handleEvent(t2) { 283 + "function" == typeof this._$AH ? this._$AH.call(this.options?.host ?? this.element, t2) : this._$AH.handleEvent(t2); 284 + } 285 + }; 286 + var W = class { 287 + static { 288 + __name(this, "W"); 289 + } 290 + constructor(t2, i2, s2) { 291 + this.element = t2, this.type = 6, this._$AN = void 0, this._$AM = i2, this.options = s2; 292 + } 293 + get _$AU() { 294 + return this._$AM._$AU; 295 + } 296 + _$AI(t2) { 297 + M(this, t2); 298 + } 299 + }; 300 + var Z = { M: h, P: o, A: n, C: 1, L: N, R: k, D: d, V: M, I: R, H, N: L, U: z, B: I, F: W }; 301 + var j = t.litHtmlPolyfillSupport; 302 + j?.(S, R), (t.litHtmlVersions ??= []).push("3.3.2"); 303 + var B = /* @__PURE__ */ __name((t2, i2, s2) => { 304 + const e2 = s2?.renderBefore ?? i2; 305 + let h2 = e2._$litPart$; 306 + if (void 0 === h2) { 307 + const t3 = s2?.renderBefore ?? null; 308 + e2._$litPart$ = h2 = new R(i2.insertBefore(c(), t3), t3, void 0, s2 ?? {}); 309 + } 310 + return h2._$AI(t2), h2; 311 + }, "B"); 312 + 313 + // common/element.js 314 + var DEFAULT_GROUP = "default"; 315 + var DiffuseElement = class extends HTMLElement { 316 + static { 317 + __name(this, "DiffuseElement"); 318 + } 319 + $connected = signal(false); 320 + #connected = Promise.withResolvers(); 321 + #disposables = ( 322 + /** @type {Array<() => void>} */ 323 + [] 324 + ); 325 + /** */ 326 + constructor() { 327 + super(); 328 + this.uuid = crypto.randomUUID(); 329 + this.worker = this.worker.bind(this); 330 + this.workerLink = this.workerLink.bind(this); 331 + } 332 + /** 333 + * @param {string} _name 334 + * @param {string} oldValue 335 + * @param {string} newValue 336 + */ 337 + attributeChangedCallback(_name, oldValue, newValue) { 338 + if (oldValue !== newValue) this.#render(); 339 + } 340 + /** 341 + * Effect helper that automatically is disposes 342 + * when this element is removed from the DOM. 343 + * 344 + * @param {() => void} fn 345 + */ 346 + effect(fn) { 347 + const unregister = effect(fn); 348 + this.#disposables.push(unregister); 349 + return unregister; 350 + } 351 + /** */ 352 + forceRender() { 353 + return this.#render(); 354 + } 355 + /** */ 356 + get group() { 357 + return this.getAttribute("group") ?? DEFAULT_GROUP; 358 + } 359 + /** */ 360 + get label() { 361 + return this.getAttribute("label") ?? this.id ?? this.localName; 362 + } 363 + /** */ 364 + get nameWithGroup() { 365 + return `${this.constructor.prototype.constructor.NAME}/${this.group}`; 366 + } 367 + /** */ 368 + root() { 369 + return this.shadowRoot ?? this; 370 + } 371 + /** */ 372 + get selector() { 373 + return this.id.length ? `#${this.id}` : this.localName; 374 + } 375 + /** */ 376 + whenConnected() { 377 + return this.#connected.promise; 378 + } 379 + /** */ 380 + whenDefined() { 381 + return customElements.whenDefined(this.localName); 382 + } 383 + /** 384 + * Avoid replacing the whole subtree, 385 + * morph the existing DOM into the new given tree. 386 + */ 387 + #render() { 388 + if (!("render" in this && typeof this.render === "function")) return; 389 + const tmp = this.render({ 390 + html: T, 391 + state: "state" in this ? this.state : void 0 392 + }); 393 + B(tmp, this.root()); 394 + } 395 + // LIFECYCLE 396 + connectedCallback() { 397 + this.$connected.value = true; 398 + this.#connected.resolve(null); 399 + if (!("render" in this && typeof this.render === "function")) return; 400 + this.effect(() => { 401 + if (!("render" in this && typeof this.render === "function")) return; 402 + this.#render(); 403 + }); 404 + } 405 + disconnectedCallback() { 406 + this.$connected.value = false; 407 + this.#teardown(); 408 + } 409 + #teardown() { 410 + this.#disposables.forEach((fn) => fn()); 411 + } 412 + // WORKERS 413 + /** @type {undefined | Worker | SharedWorker} */ 414 + #worker; 415 + createWorker() { 416 + const NAME = this.constructor.prototype.constructor.NAME; 417 + const WORKER_URL = this.constructor.prototype.constructor.WORKER_URL; 418 + if (!NAME) throw new Error("Missing `NAME` static property"); 419 + if (!WORKER_URL) throw new Error("Missing `WORKER_URL` static property"); 420 + const query2 = query_string_default.stringify( 421 + "workerQuery" in this && typeof this.workerQuery === "function" ? this.workerQuery() : {} 422 + ); 423 + const name = this.nameWithGroup; 424 + const url = import.meta.resolve("./" + WORKER_URL) + `?${query2}`; 425 + let worker; 426 + if (this.hasAttribute("group")) { 427 + worker = new SharedWorker(url, { name, type: "module" }); 428 + } else { 429 + worker = new Worker(url, { name, type: "module" }); 430 + } 431 + return worker; 432 + } 433 + /** */ 434 + dependencies() { 435 + return Object.fromEntries( 436 + Array.from(this.children).flatMap((element) => { 437 + if ("nameWithGroup" in element === false) { 438 + return []; 439 + } 440 + const d2 = ( 441 + /** @type {DiffuseElement} */ 442 + element 443 + ); 444 + return [[d2.localName, d2]]; 445 + }) 446 + ); 447 + } 448 + worker() { 449 + this.#worker ??= this.createWorker(); 450 + return this.#worker; 451 + } 452 + workerLink() { 453 + const worker = this.worker(); 454 + return workerLink(worker); 455 + } 456 + /** 457 + * @template {Record<string, (...args: any[]) => any>} Actions 458 + * @param {WorkerOpts} [opts] 459 + * @returns {ProxiedActions<Actions>} 460 + */ 461 + workerProxy(opts) { 462 + return workerProxy( 463 + () => this.workerTunnel(opts).port 464 + ); 465 + } 466 + /** 467 + * @param {WorkerOpts} [opts] 468 + */ 469 + workerTunnel({ forceNew } = {}) { 470 + const worker = forceNew === true || typeof forceNew === "object" && forceNew.self === true ? this.createWorker() : this.worker(); 471 + const deps = this.dependencies(); 472 + let toWorker; 473 + if (Object.keys(deps).length) { 474 + toWorker = /** 475 + * @param {any} msg 476 + */ 477 + /* @__PURE__ */ __name(async (msg) => { 478 + const ports = Object.entries(deps).map( 479 + /** @param {[string, DiffuseElement]} _ */ 480 + ([k2, v2]) => { 481 + const n2 = typeof forceNew === "object" ? forceNew.dependencies?.[k2] ?? false : false; 482 + return [k2, v2.workerTunnel({ forceNew: n2 })]; 483 + } 484 + ); 485 + const decoded = await decodeMessage(msg); 486 + const data = { 487 + data: Array.isArray(decoded.args) ? decoded.args[0] : decoded.args, 488 + ports: Object.fromEntries(ports.map(([k2, v2]) => { 489 + return [k2, v2.port]; 490 + })) 491 + }; 492 + const encoded = encodeMessage( 493 + { 494 + ...decoded, 495 + args: Array.isArray(decoded.args) ? [data, ...decoded.args.slice(1)] : decoded.args 496 + }, 497 + {}, 498 + true, 499 + ports.map(([_k, v2]) => v2.port) 500 + ); 501 + this.#disposables.push(() => { 502 + ports.forEach(([_k, v2]) => v2.disconnect()); 503 + }); 504 + return { 505 + data: encoded, 506 + transfer: ports.map(([_k, v2]) => v2.port) 507 + }; 508 + }, "toWorker"); 509 + } 510 + const tunnel = workerTunnel(worker, { toWorker }); 511 + return tunnel; 512 + } 513 + }; 514 + var BroadcastableDiffuseElement = class extends DiffuseElement { 515 + static { 516 + __name(this, "BroadcastableDiffuseElement"); 517 + } 518 + broadcasted = false; 519 + /** @type {{ assumeLeadership?: boolean }} */ 520 + #broadcastingOptions = {}; 521 + #broadcastingStatus; 522 + broadcastingStatus; 523 + /** @type {PromiseWithResolvers<void>} */ 524 + #lock = Promise.withResolvers(); 525 + /** @type {PromiseWithResolvers<BroadcastingStatus>} */ 526 + #status = Promise.withResolvers(); 527 + constructor() { 528 + super(); 529 + this.broadcast = this.broadcast.bind(this); 530 + this.#broadcastingStatus = signal(this.#status.promise, { eager: true }); 531 + this.broadcastingStatus = this.#broadcastingStatus.get; 532 + } 533 + /** 534 + * @template {Record<string, { strategy: "leaderOnly" | "replicate", fn: (...args: any[]) => any }>} ActionsWithStrategy 535 + * @template {{ [K in keyof ActionsWithStrategy]: ActionsWithStrategy[K]["fn"] }} Actions 536 + * @param {string} channelName 537 + * @param {ActionsWithStrategy} actionsWithStrategy 538 + * @param {{ assumeLeadership?: boolean }} [options] 539 + */ 540 + broadcast(channelName, actionsWithStrategy, options) { 541 + if (this.broadcasted) return; 542 + if (options) this.#broadcastingOptions = options; 543 + const channel = new BroadcastChannel(channelName); 544 + const msg = new MessageChannel(); 545 + this.broadcasted = true; 546 + this.channelName = channelName; 547 + const _rpc = rpc( 548 + msg.port2, 549 + Object.fromEntries( 550 + Object.entries(actionsWithStrategy).map(([k2, v2]) => { 551 + return [k2, v2.fn.bind(this)]; 552 + }) 553 + ) 554 + ); 555 + channel.addEventListener( 556 + "message", 557 + async (event) => { 558 + if (event.data?.includes('"method":"leader:')) { 559 + const status = await this.#status.promise; 560 + if (status.leader) { 561 + const json = event.data.replace('"method":"leader:', '"method":"'); 562 + msg.port1.postMessage(json); 563 + } 564 + } else { 565 + msg.port1.postMessage(event.data); 566 + } 567 + } 568 + ); 569 + msg.port1.addEventListener( 570 + "message", 571 + (event) => channel.postMessage(event.data) 572 + ); 573 + msg.port1.start(); 574 + msg.port2.start(); 575 + async function anyoneWaiting() { 576 + const state = await navigator.locks.query(); 577 + return !!state.pending?.length; 578 + } 579 + __name(anyoneWaiting, "anyoneWaiting"); 580 + const io = new BrowserPostMessageIo(() => msg.port2); 581 + const proxyChannel = new RPCChannel(io, { enableTransfer: true }); 582 + const proxy = proxyChannel.getAPI(); 583 + const actions = {}; 584 + Object.entries(actionsWithStrategy).forEach( 585 + ([action, { fn, strategy }]) => { 586 + const ogFn = fn.bind(this); 587 + let wrapFn = ogFn; 588 + switch (strategy) { 589 + case "leaderOnly": 590 + wrapFn = /* @__PURE__ */ __name(async (...args) => { 591 + const status = await this.#status.promise; 592 + return status.leader ? ogFn(...args) : proxyChannel.callMethod(`leader:${action}`, args); 593 + }, "wrapFn"); 594 + break; 595 + case "replicate": 596 + wrapFn = /* @__PURE__ */ __name(async (...args) => { 597 + anyoneWaiting().then((bool) => { 598 + if (bool) proxy[action](...args); 599 + }); 600 + return ogFn(...args); 601 + }, "wrapFn"); 602 + break; 603 + } 604 + actions[action] = wrapFn; 605 + } 606 + ); 607 + return ( 608 + /** @type {ProxiedActions<Actions>} */ 609 + actions 610 + ); 611 + } 612 + async isLeader() { 613 + if (this.broadcasted) { 614 + const status = await this.broadcastingStatus(); 615 + return status.leader; 616 + } else { 617 + return true; 618 + } 619 + } 620 + // LIFECYCLE 621 + /** 622 + * @override 623 + */ 624 + connectedCallback() { 625 + super.connectedCallback(); 626 + if (!this.broadcasted) return; 627 + const assumeLeadership = this.#broadcastingOptions?.assumeLeadership; 628 + if (assumeLeadership === void 0 || assumeLeadership === true) { 629 + navigator.locks.request( 630 + `${this.channelName}/lock`, 631 + assumeLeadership === true ? { steal: true } : { ifAvailable: true }, 632 + (lock) => { 633 + this.#status.resolve( 634 + lock ? { leader: true, initialLeader: true } : { leader: false } 635 + ); 636 + if (lock) return this.#lock.promise; 637 + } 638 + ); 639 + } else { 640 + this.#status.resolve( 641 + { leader: false } 642 + ); 643 + } 644 + this.#status.promise.then((status) => { 645 + if (status.leader) { 646 + console.log(`\u{1F9D9} Elected leader for: ${this.channelName}`); 647 + } else { 648 + console.log(`\u{1F52E} Watching leader: ${this.channelName}`); 649 + } 650 + if (status.leader === false) { 651 + navigator.locks.request( 652 + `${this.channelName}/lock`, 653 + () => { 654 + this.#status = Promise.withResolvers(); 655 + this.#status.resolve({ leader: true, initialLeader: false }); 656 + this.#broadcastingStatus.value = this.#status.promise; 657 + return this.#lock.promise; 658 + } 659 + ); 660 + } 661 + }); 662 + } 663 + /** 664 + * @override 665 + */ 666 + disconnectedCallback() { 667 + super.disconnectedCallback(); 668 + this.#lock.resolve(); 669 + } 670 + }; 671 + function component(elementModule, id) { 672 + const el = document.querySelector( 673 + id ? `${elementModule.NAME}#${id}` : elementModule.NAME 674 + ); 675 + if (!el) { 676 + throw new Error(`Element for selector '${elementModule.NAME}' not found.`); 677 + } 678 + return ( 679 + /** @type {InstanceType<C>} */ 680 + el 681 + ); 682 + } 683 + __name(component, "component"); 684 + function query(parent, attribute) { 685 + const selector = parent.getAttribute(attribute); 686 + if (!selector) { 687 + throw new Error(`Missing required '${attribute}' attribute`); 688 + } 689 + const element = document.querySelector(selector); 690 + if (!element) throw new Error(`Missing required '${selector}' element`); 691 + return element; 692 + } 693 + __name(query, "query"); 694 + function queryOptional(parent, attribute) { 695 + const selector = parent.getAttribute(attribute); 696 + if (!selector) { 697 + return null; 698 + } 699 + const elementOrNull = document.querySelector(selector); 700 + return elementOrNull; 701 + } 702 + __name(queryOptional, "queryOptional"); 703 + function terminateWorkers(workers) { 704 + Object.values(workers).forEach((worker) => { 705 + if (worker instanceof Worker) worker.terminate(); 706 + }); 707 + } 708 + __name(terminateWorkers, "terminateWorkers"); 709 + async function whenElementsDefined(elements) { 710 + await Promise.all( 711 + Object.values(elements).map( 712 + (element) => customElements.whenDefined(element.localName) 713 + ) 714 + ); 715 + } 716 + __name(whenElementsDefined, "whenElementsDefined"); 717 + 718 + export { 719 + T, 720 + A, 721 + Z, 722 + B, 723 + DEFAULT_GROUP, 724 + DiffuseElement, 725 + BroadcastableDiffuseElement, 726 + component, 727 + query, 728 + queryOptional, 729 + terminateWorkers, 730 + whenElementsDefined 731 + }; 732 + /*! Bundled license information: 733 + 734 + lit-html/node/lit-html.js: 735 + (** 736 + * @license 737 + * Copyright 2017 Google LLC 738 + * SPDX-License-Identifier: BSD-3-Clause 739 + *) 740 + */ 741 + 742 + //# sourceMappingURL=./chunk-H46AZIKM.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-H46AZIKM.js.map
··· 1 + {"version":3,"sources":["/common/element.js","/node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/src/lit-html.ts"],"sourcesContent":["import QS from \"query-string\";\nimport { decodeMessage, encodeMessage, RPCChannel } from \"@kunkun/kkrpc\";\nimport { html, render } from \"lit-html\";\n\nimport { effect, signal } from \"@common/signal.js\";\nimport { rpc, workerLink, workerProxy, workerTunnel } from \"./worker.js\";\nimport { BrowserPostMessageIo } from \"./worker/rpc.js\";\n\n/**\n * @import {BroadcastingStatus, WorkerOpts} from \"./element.d.ts\"\n * @import {ProxiedActions, Tunnel} from \"./worker.d.ts\";\n * @import {Signal} from \"./signal.d.ts\"\n */\n\nexport { html, nothing } from \"lit-html\";\nexport const DEFAULT_GROUP = \"default\";\n\n/**\n * Base for custom elements, provides some utility functionality\n * around rendering and managing signals.\n */\nexport class DiffuseElement extends HTMLElement {\n $connected = signal(false);\n\n #connected = Promise.withResolvers();\n #disposables = /** @type {Array<() => void>} */ ([]);\n\n /** */\n constructor() {\n super();\n\n this.uuid = crypto.randomUUID();\n this.worker = this.worker.bind(this);\n this.workerLink = this.workerLink.bind(this);\n }\n\n /**\n * @param {string} _name\n * @param {string} oldValue\n * @param {string} newValue\n */\n attributeChangedCallback(_name, oldValue, newValue) {\n if (oldValue !== newValue) this.#render();\n }\n\n /**\n * Effect helper that automatically is disposes\n * when this element is removed from the DOM.\n *\n * @param {() => void} fn\n */\n effect(fn) {\n const unregister = effect(fn);\n this.#disposables.push(unregister);\n return unregister;\n }\n\n /** */\n forceRender() {\n return this.#render();\n }\n\n /** */\n get group() {\n return this.getAttribute(\"group\") ?? DEFAULT_GROUP;\n }\n\n /** */\n get label() {\n return this.getAttribute(\"label\") ?? this.id ?? this.localName;\n }\n\n /** */\n get nameWithGroup() {\n return `${this.constructor.prototype.constructor.NAME}/${this.group}`;\n }\n\n /** */\n root() {\n return (this.shadowRoot ?? this);\n }\n\n /** */\n get selector() {\n return this.id.length ? `#${this.id}` : this.localName;\n }\n\n /** */\n whenConnected() {\n return this.#connected.promise;\n }\n\n /** */\n whenDefined() {\n return customElements.whenDefined(this.localName);\n }\n\n /**\n * Avoid replacing the whole subtree,\n * morph the existing DOM into the new given tree.\n */\n #render() {\n if (!(\"render\" in this && typeof this.render === \"function\")) return;\n\n const tmp = this.render({\n html: html,\n state: \"state\" in this ? this.state : undefined,\n });\n\n render(tmp, this.root());\n }\n\n // LIFECYCLE\n\n connectedCallback() {\n this.$connected.value = true;\n this.#connected.resolve(null);\n\n if (!(\"render\" in this && typeof this.render === \"function\")) return;\n\n this.effect(() => {\n if (!(\"render\" in this && typeof this.render === \"function\")) return;\n this.#render();\n });\n }\n\n disconnectedCallback() {\n this.$connected.value = false;\n this.#teardown();\n }\n\n #teardown() {\n this.#disposables.forEach((fn) => fn());\n }\n\n // WORKERS\n\n /** @type {undefined | Worker | SharedWorker} */\n #worker;\n\n createWorker() {\n const NAME = this.constructor.prototype.constructor.NAME;\n const WORKER_URL = this.constructor.prototype.constructor.WORKER_URL;\n\n if (!NAME) throw new Error(\"Missing `NAME` static property\");\n if (!WORKER_URL) throw new Error(\"Missing `WORKER_URL` static property\");\n\n // Query\n const query = QS.stringify(\n \"workerQuery\" in this && typeof this.workerQuery === \"function\"\n ? this.workerQuery()\n : {},\n );\n\n // Setup worker\n const name = this.nameWithGroup;\n const url = import.meta.resolve(\"./\" + WORKER_URL) + `?${query}`;\n\n let worker;\n\n if (this.hasAttribute(\"group\")) {\n worker = new SharedWorker(url, { name, type: \"module\" });\n } else {\n worker = new Worker(url, { name, type: \"module\" });\n }\n\n return worker;\n }\n\n /** */\n dependencies() {\n return Object.fromEntries(\n Array.from(this.children).flatMap((element) => {\n if (\"nameWithGroup\" in element === false) {\n return [];\n }\n\n const d = /** @type {DiffuseElement} */ (element);\n return [[d.localName, d]];\n }),\n );\n }\n\n worker() {\n this.#worker ??= this.createWorker();\n return this.#worker;\n }\n\n workerLink() {\n const worker = this.worker();\n return workerLink(worker);\n }\n\n /**\n * @template {Record<string, (...args: any[]) => any>} Actions\n * @param {WorkerOpts} [opts]\n * @returns {ProxiedActions<Actions>}\n */\n workerProxy(opts) {\n return workerProxy(\n () => this.workerTunnel(opts).port,\n );\n }\n\n /**\n * @param {WorkerOpts} [opts]\n */\n workerTunnel({ forceNew } = {}) {\n // Creates a MessagePort that is connected to the worker.\n // All the dependencies are added automatically.\n const worker = forceNew === true ||\n (typeof forceNew === \"object\" && forceNew.self === true)\n ? this.createWorker()\n : this.worker();\n const deps = this.dependencies();\n\n let toWorker;\n\n if (Object.keys(deps).length) {\n toWorker =\n /**\n * @param {any} msg\n */\n async (msg) => {\n /** @type {Array<[string, Tunnel]>} */\n const ports = Object.entries(deps).map(\n /** @param {[string, DiffuseElement]} _ */\n ([k, v]) => {\n const n = typeof forceNew === \"object\"\n ? forceNew.dependencies?.[k] ?? false\n : false;\n return [k, v.workerTunnel({ forceNew: n })];\n },\n );\n\n const decoded = await decodeMessage(msg);\n const data = {\n data: Array.isArray(decoded.args) ? decoded.args[0] : decoded.args,\n ports: Object.fromEntries(ports.map(([k, v]) => {\n return [k, v.port];\n })),\n };\n\n const encoded = encodeMessage(\n {\n ...decoded,\n args: Array.isArray(decoded.args)\n ? [data, ...decoded.args.slice(1)]\n : decoded.args,\n },\n {},\n true,\n ports.map(([_k, v]) => v.port),\n );\n\n this.#disposables.push(() => {\n ports.forEach(([_k, v]) => v.disconnect());\n });\n\n return {\n data: encoded,\n transfer: ports.map(([_k, v]) => v.port),\n };\n };\n }\n\n const tunnel = workerTunnel(worker, { toWorker });\n return tunnel;\n }\n}\n\n/**\n * Broadcastable version of the base class.\n *\n * Share the state of an element across multiple tabs\n * of the same origin and have one instance be the leader.\n */\nexport class BroadcastableDiffuseElement extends DiffuseElement {\n broadcasted = false;\n\n /** @type {{ assumeLeadership?: boolean }} */\n #broadcastingOptions = {};\n\n #broadcastingStatus;\n broadcastingStatus;\n\n /** @type {PromiseWithResolvers<void>} */\n #lock = Promise.withResolvers();\n\n /** @type {PromiseWithResolvers<BroadcastingStatus>} */\n #status = Promise.withResolvers();\n\n constructor() {\n super();\n\n this.broadcast = this.broadcast.bind(this);\n\n /** @type {Signal<Promise<BroadcastingStatus>>} */\n this.#broadcastingStatus = signal(this.#status.promise, { eager: true });\n this.broadcastingStatus = this.#broadcastingStatus.get;\n }\n\n /**\n * @template {Record<string, { strategy: \"leaderOnly\" | \"replicate\", fn: (...args: any[]) => any }>} ActionsWithStrategy\n * @template {{ [K in keyof ActionsWithStrategy]: ActionsWithStrategy[K][\"fn\"] }} Actions\n * @param {string} channelName\n * @param {ActionsWithStrategy} actionsWithStrategy\n * @param {{ assumeLeadership?: boolean }} [options]\n */\n broadcast(channelName, actionsWithStrategy, options) {\n if (this.broadcasted) return;\n if (options) this.#broadcastingOptions = options;\n\n const channel = new BroadcastChannel(channelName);\n const msg = new MessageChannel();\n\n /**\n * @typedef {{ [K in keyof ActionsWithStrategy]: ActionsWithStrategy[K][\"fn\"] }} A\n */\n\n this.broadcasted = true;\n this.channelName = channelName;\n\n const _rpc = rpc(\n msg.port2,\n Object.fromEntries(\n Object.entries(actionsWithStrategy).map(([k, v]) => {\n return [k, v.fn.bind(this)];\n }),\n ),\n );\n\n channel.addEventListener(\n \"message\",\n async (event) => {\n if (event.data?.includes('\"method\":\"leader:')) {\n const status = await this.#status.promise;\n if (status.leader) {\n const json = event.data.replace('\"method\":\"leader:', '\"method\":\"');\n msg.port1.postMessage(json);\n }\n } else {\n msg.port1.postMessage(event.data);\n }\n },\n );\n\n msg.port1.addEventListener(\n \"message\",\n (event) => channel.postMessage(event.data),\n );\n\n msg.port1.start();\n msg.port2.start();\n\n async function anyoneWaiting() {\n const state = await navigator.locks.query();\n return !!state.pending?.length;\n }\n\n const io = new BrowserPostMessageIo(() => msg.port2);\n\n /** @type {undefined | RPCChannel<{}, ProxiedActions<Actions>>} */\n const proxyChannel = new RPCChannel(io, { enableTransfer: true });\n\n /** @type {ProxiedActions<Actions>} */\n const proxy = proxyChannel.getAPI();\n\n /** @type {any} */\n const actions = {};\n\n Object.entries(actionsWithStrategy).forEach(\n ([action, { fn, strategy }]) => {\n const ogFn = fn.bind(this);\n let wrapFn = ogFn;\n\n switch (strategy) {\n case \"leaderOnly\":\n /** @param {Parameters<Actions[action]>} args */\n wrapFn = async (...args) => {\n const status = await this.#status.promise;\n return status.leader\n ? ogFn(...args)\n : proxyChannel.callMethod(`leader:${action}`, args);\n };\n break;\n\n case \"replicate\":\n /** @param {Parameters<Actions[action]>} args */\n wrapFn = async (...args) => {\n anyoneWaiting().then((bool) => {\n if (bool) proxy[action](...args);\n });\n return ogFn(...args);\n };\n break;\n }\n\n actions[action] = wrapFn;\n },\n );\n\n return /** @type {ProxiedActions<Actions>} */ (actions);\n }\n\n async isLeader() {\n if (this.broadcasted) {\n const status = await this.broadcastingStatus();\n return status.leader;\n } else {\n return true;\n }\n }\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n if (!this.broadcasted) return;\n\n // Grab a lock if it isn't acquired yet and if needed,\n // and hold it until `this.lock.promise` resolves.\n const assumeLeadership = this.#broadcastingOptions?.assumeLeadership;\n\n if (assumeLeadership === undefined || assumeLeadership === true) {\n navigator.locks.request(\n `${this.channelName}/lock`,\n assumeLeadership === true ? { steal: true } : { ifAvailable: true },\n (lock) => {\n this.#status.resolve(\n lock ? { leader: true, initialLeader: true } : { leader: false },\n );\n if (lock) return this.#lock.promise;\n },\n );\n } else {\n this.#status.resolve(\n { leader: false },\n );\n }\n\n // When the lock status is initially determined, log its status.\n // Additionally, wait for lock if needed.\n this.#status.promise.then((status) => {\n if (status.leader) {\n console.log(`🧙 Elected leader for: ${this.channelName}`);\n } else {\n console.log(`🔮 Watching leader: ${this.channelName}`);\n }\n\n // Wait for leadership\n if (status.leader === false) {\n navigator.locks.request(\n `${this.channelName}/lock`,\n () => {\n this.#status = Promise.withResolvers();\n this.#status.resolve({ leader: true, initialLeader: false });\n\n this.#broadcastingStatus.value = this.#status.promise;\n\n return this.#lock.promise;\n },\n );\n }\n });\n }\n\n /**\n * @override\n */\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#lock.resolve();\n }\n}\n\n/**\n * Component DOM selector.\n *\n * Basically `document.querySelector` but returns the element\n * with the correct type based on the element module given.\n *\n * ```\n * import * as QueryEngine from \"@components/engine/query/element.js\"\n *\n * const instance = component(QueryEngine)\n * ```\n *\n * @template {abstract new (...args: any[]) => any} C\n * @param {{ CLASS: C; NAME: string }} elementModule\n * @param {string} [id] Optional id to select\n */\nexport function component(elementModule, id) {\n const el = document.querySelector(\n id ? `${elementModule.NAME}#${id}` : elementModule.NAME,\n );\n if (!el) {\n throw new Error(`Element for selector '${elementModule.NAME}' not found.`);\n }\n return /** @type {InstanceType<C>} */ (el);\n}\n\n/**\n * @template {HTMLElement} T\n * @param {DiffuseElement} parent\n * @param {string} attribute\n * @returns {T}\n */\nexport function query(parent, attribute) {\n const selector = parent.getAttribute(attribute);\n\n if (!selector) {\n throw new Error(`Missing required '${attribute}' attribute`);\n }\n\n /** @type {T | null} */\n const element = document.querySelector(selector);\n if (!element) throw new Error(`Missing required '${selector}' element`);\n return element;\n}\n\n/**\n * @template {HTMLElement} T\n * @param {DiffuseElement} parent\n * @param {string} attribute\n */\nexport function queryOptional(parent, attribute) {\n const selector = parent.getAttribute(attribute);\n\n if (!selector) {\n return null;\n }\n\n /** @type {T | null} */\n const elementOrNull = document.querySelector(selector);\n return elementOrNull;\n}\n\n/**\n * @param {Record<string, Worker | SharedWorker>} workers\n */\nexport function terminateWorkers(workers) {\n Object.values(workers).forEach((worker) => {\n if (worker instanceof Worker) worker.terminate();\n });\n}\n\n/**\n * @template {Record<string, DiffuseElement>} T\n * @param {T} elements\n */\nexport async function whenElementsDefined(elements) {\n await Promise.all(\n Object.values(elements).map((element) =>\n customElements.whenDefined(element.localName)\n ),\n );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n// IMPORTANT: these imports must be type-only\nimport type {Directive, DirectiveResult, PartInfo} from './directive.js';\nimport type {TrustedHTML, TrustedTypesWindow} from 'trusted-types/lib/index.js';\n\nconst DEV_MODE = true;\nconst ENABLE_EXTRA_SECURITY_HOOKS = true;\nconst ENABLE_SHADYDOM_NOPATCH = true;\nconst NODE_MODE = false;\n\n// Allows minifiers to rename references to globalThis\nconst global = globalThis;\n\n/**\n * Contains types that are part of the unstable debug API.\n *\n * Everything in this API is not stable and may change or be removed in the future,\n * even on patch releases.\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace LitUnstable {\n /**\n * When Lit is running in dev mode and `window.emitLitDebugLogEvents` is true,\n * we will emit 'lit-debug' events to window, with live details about the update and render\n * lifecycle. These can be useful for writing debug tooling and visualizations.\n *\n * Please be aware that running with window.emitLitDebugLogEvents has performance overhead,\n * making certain operations that are normally very cheap (like a no-op render) much slower,\n * because we must copy data and dispatch events.\n */\n // eslint-disable-next-line @typescript-eslint/no-namespace\n export namespace DebugLog {\n export type Entry =\n | TemplatePrep\n | TemplateInstantiated\n | TemplateInstantiatedAndUpdated\n | TemplateUpdating\n | BeginRender\n | EndRender\n | CommitPartEntry\n | SetPartValue;\n export interface TemplatePrep {\n kind: 'template prep';\n template: Template;\n strings: TemplateStringsArray;\n clonableTemplate: HTMLTemplateElement;\n parts: TemplatePart[];\n }\n export interface BeginRender {\n kind: 'begin render';\n id: number;\n value: unknown;\n container: RenderRootNode;\n options: RenderOptions | undefined;\n part: ChildPart | undefined;\n }\n export interface EndRender {\n kind: 'end render';\n id: number;\n value: unknown;\n container: RenderRootNode;\n options: RenderOptions | undefined;\n part: ChildPart;\n }\n export interface TemplateInstantiated {\n kind: 'template instantiated';\n template: Template | CompiledTemplate;\n instance: TemplateInstance;\n options: RenderOptions | undefined;\n fragment: Node;\n parts: Array<Part | undefined>;\n values: unknown[];\n }\n export interface TemplateInstantiatedAndUpdated {\n kind: 'template instantiated and updated';\n template: Template | CompiledTemplate;\n instance: TemplateInstance;\n options: RenderOptions | undefined;\n fragment: Node;\n parts: Array<Part | undefined>;\n values: unknown[];\n }\n export interface TemplateUpdating {\n kind: 'template updating';\n template: Template | CompiledTemplate;\n instance: TemplateInstance;\n options: RenderOptions | undefined;\n parts: Array<Part | undefined>;\n values: unknown[];\n }\n export interface SetPartValue {\n kind: 'set part';\n part: Part;\n value: unknown;\n valueIndex: number;\n values: unknown[];\n templateInstance: TemplateInstance;\n }\n\n export type CommitPartEntry =\n | CommitNothingToChildEntry\n | CommitText\n | CommitNode\n | CommitAttribute\n | CommitProperty\n | CommitBooleanAttribute\n | CommitEventListener\n | CommitToElementBinding;\n\n export interface CommitNothingToChildEntry {\n kind: 'commit nothing to child';\n start: ChildNode;\n end: ChildNode | null;\n parent: Disconnectable | undefined;\n options: RenderOptions | undefined;\n }\n\n export interface CommitText {\n kind: 'commit text';\n node: Text;\n value: unknown;\n options: RenderOptions | undefined;\n }\n\n export interface CommitNode {\n kind: 'commit node';\n start: Node;\n parent: Disconnectable | undefined;\n value: Node;\n options: RenderOptions | undefined;\n }\n\n export interface CommitAttribute {\n kind: 'commit attribute';\n element: Element;\n name: string;\n value: unknown;\n options: RenderOptions | undefined;\n }\n\n export interface CommitProperty {\n kind: 'commit property';\n element: Element;\n name: string;\n value: unknown;\n options: RenderOptions | undefined;\n }\n\n export interface CommitBooleanAttribute {\n kind: 'commit boolean attribute';\n element: Element;\n name: string;\n value: boolean;\n options: RenderOptions | undefined;\n }\n\n export interface CommitEventListener {\n kind: 'commit event listener';\n element: Element;\n name: string;\n value: unknown;\n oldListener: unknown;\n options: RenderOptions | undefined;\n // True if we're removing the old event listener (e.g. because settings changed, or value is nothing)\n removeListener: boolean;\n // True if we're adding a new event listener (e.g. because first render, or settings changed)\n addListener: boolean;\n }\n\n export interface CommitToElementBinding {\n kind: 'commit to element binding';\n element: Element;\n value: unknown;\n options: RenderOptions | undefined;\n }\n }\n}\n\ninterface DebugLoggingWindow {\n // Even in dev mode, we generally don't want to emit these events, as that's\n // another level of cost, so only emit them when DEV_MODE is true _and_ when\n // window.emitLitDebugEvents is true.\n emitLitDebugLogEvents?: boolean;\n}\n\n/**\n * Useful for visualizing and logging insights into what the Lit template system is doing.\n *\n * Compiled out of prod mode builds.\n */\nconst debugLogEvent = DEV_MODE\n ? (event: LitUnstable.DebugLog.Entry) => {\n const shouldEmit = (global as unknown as DebugLoggingWindow)\n .emitLitDebugLogEvents;\n if (!shouldEmit) {\n return;\n }\n global.dispatchEvent(\n new CustomEvent<LitUnstable.DebugLog.Entry>('lit-debug', {\n detail: event,\n })\n );\n }\n : undefined;\n// Used for connecting beginRender and endRender events when there are nested\n// renders when errors are thrown preventing an endRender event from being\n// called.\nlet debugLogRenderId = 0;\n\nlet issueWarning: (code: string, warning: string) => void;\n\nif (DEV_MODE) {\n global.litIssuedWarnings ??= new Set();\n\n /**\n * Issue a warning if we haven't already, based either on `code` or `warning`.\n * Warnings are disabled automatically only by `warning`; disabling via `code`\n * can be done by users.\n */\n issueWarning = (code: string, warning: string) => {\n warning += code\n ? ` See https://lit.dev/msg/${code} for more information.`\n : '';\n if (\n !global.litIssuedWarnings!.has(warning) &&\n !global.litIssuedWarnings!.has(code)\n ) {\n console.warn(warning);\n global.litIssuedWarnings!.add(warning);\n }\n };\n\n queueMicrotask(() => {\n issueWarning(\n 'dev-mode',\n `Lit is in dev mode. Not recommended for production!`\n );\n });\n}\n\nconst wrap =\n ENABLE_SHADYDOM_NOPATCH &&\n global.ShadyDOM?.inUse &&\n global.ShadyDOM?.noPatch === true\n ? (global.ShadyDOM!.wrap as <T extends Node>(node: T) => T)\n : <T extends Node>(node: T) => node;\n\nconst trustedTypes = (global as unknown as TrustedTypesWindow).trustedTypes;\n\n/**\n * Our TrustedTypePolicy for HTML which is declared using the html template\n * tag function.\n *\n * That HTML is a developer-authored constant, and is parsed with innerHTML\n * before any untrusted expressions have been mixed in. Therefor it is\n * considered safe by construction.\n */\nconst policy = trustedTypes\n ? trustedTypes.createPolicy('lit-html', {\n createHTML: (s) => s,\n })\n : undefined;\n\n/**\n * Used to sanitize any value before it is written into the DOM. This can be\n * used to implement a security policy of allowed and disallowed values in\n * order to prevent XSS attacks.\n *\n * One way of using this callback would be to check attributes and properties\n * against a list of high risk fields, and require that values written to such\n * fields be instances of a class which is safe by construction. Closure's Safe\n * HTML Types is one implementation of this technique (\n * https://github.com/google/safe-html-types/blob/master/doc/safehtml-types.md).\n * The TrustedTypes polyfill in API-only mode could also be used as a basis\n * for this technique (https://github.com/WICG/trusted-types).\n *\n * @param node The HTML node (usually either a #text node or an Element) that\n * is being written to. Note that this is just an exemplar node, the write\n * may take place against another instance of the same class of node.\n * @param name The name of an attribute or property (for example, 'href').\n * @param type Indicates whether the write that's about to be performed will\n * be to a property or a node.\n * @return A function that will sanitize this class of writes.\n */\nexport type SanitizerFactory = (\n node: Node,\n name: string,\n type: 'property' | 'attribute'\n) => ValueSanitizer;\n\n/**\n * A function which can sanitize values that will be written to a specific kind\n * of DOM sink.\n *\n * See SanitizerFactory.\n *\n * @param value The value to sanitize. Will be the actual value passed into\n * the lit-html template literal, so this could be of any type.\n * @return The value to write to the DOM. Usually the same as the input value,\n * unless sanitization is needed.\n */\nexport type ValueSanitizer = (value: unknown) => unknown;\n\nconst identityFunction: ValueSanitizer = (value: unknown) => value;\nconst noopSanitizer: SanitizerFactory = (\n _node: Node,\n _name: string,\n _type: 'property' | 'attribute'\n) => identityFunction;\n\n/** Sets the global sanitizer factory. */\nconst setSanitizer = (newSanitizer: SanitizerFactory) => {\n if (!ENABLE_EXTRA_SECURITY_HOOKS) {\n return;\n }\n if (sanitizerFactoryInternal !== noopSanitizer) {\n throw new Error(\n `Attempted to overwrite existing lit-html security policy.` +\n ` setSanitizeDOMValueFactory should be called at most once.`\n );\n }\n sanitizerFactoryInternal = newSanitizer;\n};\n\n/**\n * Only used in internal tests, not a part of the public API.\n */\nconst _testOnlyClearSanitizerFactoryDoNotCallOrElse = () => {\n sanitizerFactoryInternal = noopSanitizer;\n};\n\nconst createSanitizer: SanitizerFactory = (node, name, type) => {\n return sanitizerFactoryInternal(node, name, type);\n};\n\n// Added to an attribute name to mark the attribute as bound so we can find\n// it easily.\nconst boundAttributeSuffix = '$lit$';\n\n// This marker is used in many syntactic positions in HTML, so it must be\n// a valid element name and attribute name. We don't support dynamic names (yet)\n// but this at least ensures that the parse tree is closer to the template\n// intention.\nconst marker = `lit$${Math.random().toFixed(9).slice(2)}$`;\n\n// String used to tell if a comment is a marker comment\nconst markerMatch = '?' + marker;\n\n// Text used to insert a comment marker node. We use processing instruction\n// syntax because it's slightly smaller, but parses as a comment node.\nconst nodeMarker = `<${markerMatch}>`;\n\nconst d =\n NODE_MODE && global.document === undefined\n ? ({\n createTreeWalker() {\n return {};\n },\n } as unknown as Document)\n : document;\n\n// Creates a dynamic marker. We never have to search for these in the DOM.\nconst createMarker = () => d.createComment('');\n\n// https://tc39.github.io/ecma262/#sec-typeof-operator\ntype Primitive = null | undefined | boolean | number | string | symbol | bigint;\nconst isPrimitive = (value: unknown): value is Primitive =>\n value === null || (typeof value != 'object' && typeof value != 'function');\nconst isArray = Array.isArray;\nconst isIterable = (value: unknown): value is Iterable<unknown> =>\n isArray(value) ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (value as any)?.[Symbol.iterator] === 'function';\n\nconst SPACE_CHAR = `[ \\t\\n\\f\\r]`;\nconst ATTR_VALUE_CHAR = `[^ \\t\\n\\f\\r\"'\\`<>=]`;\nconst NAME_CHAR = `[^\\\\s\"'>=/]`;\n\n// These regexes represent the five parsing states that we care about in the\n// Template's HTML scanner. They match the *end* of the state they're named\n// after.\n// Depending on the match, we transition to a new state. If there's no match,\n// we stay in the same state.\n// Note that the regexes are stateful. We utilize lastIndex and sync it\n// across the multiple regexes used. In addition to the five regexes below\n// we also dynamically create a regex to find the matching end tags for raw\n// text elements.\n\n/**\n * End of text is: `<` followed by:\n * (comment start) or (tag) or (dynamic tag binding)\n */\nconst textEndRegex = /<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g;\nconst COMMENT_START = 1;\nconst TAG_NAME = 2;\nconst DYNAMIC_TAG_NAME = 3;\n\nconst commentEndRegex = /-->/g;\n/**\n * Comments not started with <!--, like </{, can be ended by a single `>`\n */\nconst comment2EndRegex = />/g;\n\n/**\n * The tagEnd regex matches the end of the \"inside an opening\" tag syntax\n * position. It either matches a `>`, an attribute-like sequence, or the end\n * of the string after a space (attribute-name position ending).\n *\n * See attributes in the HTML spec:\n * https://www.w3.org/TR/html5/syntax.html#elements-attributes\n *\n * \" \\t\\n\\f\\r\" are HTML space characters:\n * https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * So an attribute is:\n * * The name: any character except a whitespace character, (\"), ('), \">\",\n * \"=\", or \"/\". Note: this is different from the HTML spec which also excludes control characters.\n * * Followed by zero or more space characters\n * * Followed by \"=\"\n * * Followed by zero or more space characters\n * * Followed by:\n * * Any character except space, ('), (\"), \"<\", \">\", \"=\", (`), or\n * * (\") then any non-(\"), or\n * * (') then any non-(')\n */\nconst tagEndRegex = new RegExp(\n `>|${SPACE_CHAR}(?:(${NAME_CHAR}+)(${SPACE_CHAR}*=${SPACE_CHAR}*(?:${ATTR_VALUE_CHAR}|(\"|')|))|$)`,\n 'g'\n);\nconst ENTIRE_MATCH = 0;\nconst ATTRIBUTE_NAME = 1;\nconst SPACES_AND_EQUALS = 2;\nconst QUOTE_CHAR = 3;\n\nconst singleQuoteAttrEndRegex = /'/g;\nconst doubleQuoteAttrEndRegex = /\"/g;\n/**\n * Matches the raw text elements.\n *\n * Comments are not parsed within raw text elements, so we need to search their\n * text content for marker strings.\n */\nconst rawTextElement = /^(?:script|style|textarea|title)$/i;\n\n/** TemplateResult types */\nconst HTML_RESULT = 1;\nconst SVG_RESULT = 2;\nconst MATHML_RESULT = 3;\n\ntype ResultType = typeof HTML_RESULT | typeof SVG_RESULT | typeof MATHML_RESULT;\n\n// TemplatePart types\n// IMPORTANT: these must match the values in PartType\nconst ATTRIBUTE_PART = 1;\nconst CHILD_PART = 2;\nconst PROPERTY_PART = 3;\nconst BOOLEAN_ATTRIBUTE_PART = 4;\nconst EVENT_PART = 5;\nconst ELEMENT_PART = 6;\nconst COMMENT_PART = 7;\n\n/**\n * The return type of the template tag functions, {@linkcode html} and\n * {@linkcode svg} when it hasn't been compiled by @lit-labs/compiler.\n *\n * A `TemplateResult` object holds all the information about a template\n * expression required to render it: the template strings, expression values,\n * and type of template (html or svg).\n *\n * `TemplateResult` objects do not create any DOM on their own. To create or\n * update DOM you need to render the `TemplateResult`. See\n * [Rendering](https://lit.dev/docs/components/rendering) for more information.\n *\n */\nexport type UncompiledTemplateResult<T extends ResultType = ResultType> = {\n // This property needs to remain unminified.\n ['_$litType$']: T;\n strings: TemplateStringsArray;\n values: unknown[];\n};\n\n/**\n * This is a template result that may be either uncompiled or compiled.\n *\n * In the future, TemplateResult will be this type. If you want to explicitly\n * note that a template result is potentially compiled, you can reference this\n * type and it will continue to behave the same through the next major version\n * of Lit. This can be useful for code that wants to prepare for the next\n * major version of Lit.\n */\nexport type MaybeCompiledTemplateResult<T extends ResultType = ResultType> =\n | UncompiledTemplateResult<T>\n | CompiledTemplateResult;\n\n/**\n * The return type of the template tag functions, {@linkcode html} and\n * {@linkcode svg}.\n *\n * A `TemplateResult` object holds all the information about a template\n * expression required to render it: the template strings, expression values,\n * and type of template (html or svg).\n *\n * `TemplateResult` objects do not create any DOM on their own. To create or\n * update DOM you need to render the `TemplateResult`. See\n * [Rendering](https://lit.dev/docs/components/rendering) for more information.\n *\n * In Lit 4, this type will be an alias of\n * MaybeCompiledTemplateResult, so that code will get type errors if it assumes\n * that Lit templates are not compiled. When deliberately working with only\n * one, use either {@linkcode CompiledTemplateResult} or\n * {@linkcode UncompiledTemplateResult} explicitly.\n */\nexport type TemplateResult<T extends ResultType = ResultType> =\n UncompiledTemplateResult<T>;\n\nexport type HTMLTemplateResult = TemplateResult<typeof HTML_RESULT>;\n\nexport type SVGTemplateResult = TemplateResult<typeof SVG_RESULT>;\n\nexport type MathMLTemplateResult = TemplateResult<typeof MATHML_RESULT>;\n\n/**\n * A TemplateResult that has been compiled by @lit-labs/compiler, skipping the\n * prepare step.\n */\nexport interface CompiledTemplateResult {\n // This is a factory in order to make template initialization lazy\n // and allow ShadyRenderOptions scope to be passed in.\n // This property needs to remain unminified.\n ['_$litType$']: CompiledTemplate;\n values: unknown[];\n}\n\nexport interface CompiledTemplate extends Omit<Template, 'el'> {\n // el is overridden to be optional. We initialize it on first render\n el?: HTMLTemplateElement;\n\n // The prepared HTML string to create a template element from.\n // The type is a TemplateStringsArray to guarantee that the value came from\n // source code, preventing a JSON injection attack.\n h: TemplateStringsArray;\n}\n\n/**\n * Generates a template literal tag function that returns a TemplateResult with\n * the given result type.\n */\nconst tag =\n <T extends ResultType>(type: T) =>\n (strings: TemplateStringsArray, ...values: unknown[]): TemplateResult<T> => {\n // Warn against templates octal escape sequences\n // We do this here rather than in render so that the warning is closer to the\n // template definition.\n if (DEV_MODE && strings.some((s) => s === undefined)) {\n console.warn(\n 'Some template strings are undefined.\\n' +\n 'This is probably caused by illegal octal escape sequences.'\n );\n }\n if (DEV_MODE) {\n // Import static-html.js results in a circular dependency which g3 doesn't\n // handle. Instead we know that static values must have the field\n // `_$litStatic$`.\n if (\n values.some((val) => (val as {_$litStatic$: unknown})?.['_$litStatic$'])\n ) {\n issueWarning(\n '',\n `Static values 'literal' or 'unsafeStatic' cannot be used as values to non-static templates.\\n` +\n `Please use the static 'html' tag function. See https://lit.dev/docs/templates/expressions/#static-expressions`\n );\n }\n }\n return {\n // This property needs to remain unminified.\n ['_$litType$']: type,\n strings,\n values,\n };\n };\n\n/**\n * Interprets a template literal as an HTML template that can efficiently\n * render to and update a container.\n *\n * ```ts\n * const header = (title: string) => html`<h1>${title}</h1>`;\n * ```\n *\n * The `html` tag returns a description of the DOM to render as a value. It is\n * lazy, meaning no work is done until the template is rendered. When rendering,\n * if a template comes from the same expression as a previously rendered result,\n * it's efficiently updated instead of replaced.\n */\nexport const html = tag(HTML_RESULT);\n\n/**\n * Interprets a template literal as an SVG fragment that can efficiently render\n * to and update a container.\n *\n * ```ts\n * const rect = svg`<rect width=\"10\" height=\"10\"></rect>`;\n *\n * const myImage = html`\n * <svg viewBox=\"0 0 10 10\" xmlns=\"http://www.w3.org/2000/svg\">\n * ${rect}\n * </svg>`;\n * ```\n *\n * The `svg` *tag function* should only be used for SVG fragments, or elements\n * that would be contained **inside** an `<svg>` HTML element. A common error is\n * placing an `<svg>` *element* in a template tagged with the `svg` tag\n * function. The `<svg>` element is an HTML element and should be used within a\n * template tagged with the {@linkcode html} tag function.\n *\n * In LitElement usage, it's invalid to return an SVG fragment from the\n * `render()` method, as the SVG fragment will be contained within the element's\n * shadow root and thus not be properly contained within an `<svg>` HTML\n * element.\n */\nexport const svg = tag(SVG_RESULT);\n\n/**\n * Interprets a template literal as MathML fragment that can efficiently render\n * to and update a container.\n *\n * ```ts\n * const num = mathml`<mn>1</mn>`;\n *\n * const eq = html`\n * <math>\n * ${num}\n * </math>`;\n * ```\n *\n * The `mathml` *tag function* should only be used for MathML fragments, or\n * elements that would be contained **inside** a `<math>` HTML element. A common\n * error is placing a `<math>` *element* in a template tagged with the `mathml`\n * tag function. The `<math>` element is an HTML element and should be used\n * within a template tagged with the {@linkcode html} tag function.\n *\n * In LitElement usage, it's invalid to return an MathML fragment from the\n * `render()` method, as the MathML fragment will be contained within the\n * element's shadow root and thus not be properly contained within a `<math>`\n * HTML element.\n */\nexport const mathml = tag(MATHML_RESULT);\n\n/**\n * A sentinel value that signals that a value was handled by a directive and\n * should not be written to the DOM.\n */\nexport const noChange = Symbol.for('lit-noChange');\n\n/**\n * A sentinel value that signals a ChildPart to fully clear its content.\n *\n * ```ts\n * const button = html`${\n * user.isAdmin\n * ? html`<button>DELETE</button>`\n * : nothing\n * }`;\n * ```\n *\n * Prefer using `nothing` over other falsy values as it provides a consistent\n * behavior between various expression binding contexts.\n *\n * In child expressions, `undefined`, `null`, `''`, and `nothing` all behave the\n * same and render no nodes. In attribute expressions, `nothing` _removes_ the\n * attribute, while `undefined` and `null` will render an empty string. In\n * property expressions `nothing` becomes `undefined`.\n */\nexport const nothing = Symbol.for('lit-nothing');\n\n/**\n * The cache of prepared templates, keyed by the tagged TemplateStringsArray\n * and _not_ accounting for the specific template tag used. This means that\n * template tags cannot be dynamic - they must statically be one of html, svg,\n * or attr. This restriction simplifies the cache lookup, which is on the hot\n * path for rendering.\n */\nconst templateCache = new WeakMap<TemplateStringsArray, Template>();\n\n/**\n * Object specifying options for controlling lit-html rendering. Note that\n * while `render` may be called multiple times on the same `container` (and\n * `renderBefore` reference node) to efficiently update the rendered content,\n * only the options passed in during the first render are respected during\n * the lifetime of renders to that unique `container` + `renderBefore`\n * combination.\n */\nexport interface RenderOptions {\n /**\n * An object to use as the `this` value for event listeners. It's often\n * useful to set this to the host component rendering a template.\n */\n host?: object;\n /**\n * A DOM node before which to render content in the container.\n */\n renderBefore?: ChildNode | null;\n /**\n * Node used for cloning the template (`importNode` will be called on this\n * node). This controls the `ownerDocument` of the rendered DOM, along with\n * any inherited context. Defaults to the global `document`.\n */\n creationScope?: {importNode(node: Node, deep?: boolean): Node};\n /**\n * The initial connected state for the top-level part being rendered. If no\n * `isConnected` option is set, `AsyncDirective`s will be connected by\n * default. Set to `false` if the initial render occurs in a disconnected tree\n * and `AsyncDirective`s should see `isConnected === false` for their initial\n * render. The `part.setConnected()` method must be used subsequent to initial\n * render to change the connected state of the part.\n */\n isConnected?: boolean;\n}\n\n/**\n * The root DOM node for rendering.\n */\nexport type RenderRootNode = HTMLElement | SVGElement | DocumentFragment;\n\nconst walker = d.createTreeWalker(\n d,\n 129 /* NodeFilter.SHOW_{ELEMENT|COMMENT} */\n);\n\nlet sanitizerFactoryInternal: SanitizerFactory = noopSanitizer;\n\n//\n// Classes only below here, const variable declarations only above here...\n//\n// Keeping variable declarations and classes together improves minification.\n// Interfaces and type aliases can be interleaved freely.\n//\n\n// Type for classes that have a `_directive` or `_directives[]` field, used by\n// `resolveDirective`\nexport interface DirectiveParent {\n _$parent?: DirectiveParent;\n _$isConnected: boolean;\n __directive?: Directive;\n __directives?: Array<Directive | undefined>;\n}\n\nfunction trustFromTemplateString(\n tsa: TemplateStringsArray,\n stringFromTSA: string\n): TrustedHTML {\n // A security check to prevent spoofing of Lit template results.\n // In the future, we may be able to replace this with Array.isTemplateObject,\n // though we might need to make that check inside of the html and svg\n // functions, because precompiled templates don't come in as\n // TemplateStringArray objects.\n if (!isArray(tsa) || !tsa.hasOwnProperty('raw')) {\n let message = 'invalid template strings array';\n if (DEV_MODE) {\n message = `\n Internal Error: expected template strings to be an array\n with a 'raw' field. Faking a template strings array by\n calling html or svg like an ordinary function is effectively\n the same as calling unsafeHtml and can lead to major security\n issues, e.g. opening your code up to XSS attacks.\n If you're using the html or svg tagged template functions normally\n and still seeing this error, please file a bug at\n https://github.com/lit/lit/issues/new?template=bug_report.md\n and include information about your build tooling, if any.\n `\n .trim()\n .replace(/\\n */g, '\\n');\n }\n throw new Error(message);\n }\n return policy !== undefined\n ? policy.createHTML(stringFromTSA)\n : (stringFromTSA as unknown as TrustedHTML);\n}\n\n/**\n * Returns an HTML string for the given TemplateStringsArray and result type\n * (HTML or SVG), along with the case-sensitive bound attribute names in\n * template order. The HTML contains comment markers denoting the `ChildPart`s\n * and suffixes on bound attributes denoting the `AttributeParts`.\n *\n * @param strings template strings array\n * @param type HTML or SVG\n * @return Array containing `[html, attrNames]` (array returned for terseness,\n * to avoid object fields since this code is shared with non-minified SSR\n * code)\n */\nconst getTemplateHtml = (\n strings: TemplateStringsArray,\n type: ResultType\n): [TrustedHTML, Array<string>] => {\n // Insert makers into the template HTML to represent the position of\n // bindings. The following code scans the template strings to determine the\n // syntactic position of the bindings. They can be in text position, where\n // we insert an HTML comment, attribute value position, where we insert a\n // sentinel string and re-write the attribute name, or inside a tag where\n // we insert the sentinel string.\n const l = strings.length - 1;\n // Stores the case-sensitive bound attribute names in the order of their\n // parts. ElementParts are also reflected in this array as undefined\n // rather than a string, to disambiguate from attribute bindings.\n const attrNames: Array<string> = [];\n let html =\n type === SVG_RESULT ? '<svg>' : type === MATHML_RESULT ? '<math>' : '';\n\n // When we're inside a raw text tag (not it's text content), the regex\n // will still be tagRegex so we can find attributes, but will switch to\n // this regex when the tag ends.\n let rawTextEndRegex: RegExp | undefined;\n\n // The current parsing state, represented as a reference to one of the\n // regexes\n let regex = textEndRegex;\n\n for (let i = 0; i < l; i++) {\n const s = strings[i];\n // The index of the end of the last attribute name. When this is\n // positive at end of a string, it means we're in an attribute value\n // position and need to rewrite the attribute name.\n // We also use a special value of -2 to indicate that we encountered\n // the end of a string in attribute name position.\n let attrNameEndIndex = -1;\n let attrName: string | undefined;\n let lastIndex = 0;\n let match!: RegExpExecArray | null;\n\n // The conditions in this loop handle the current parse state, and the\n // assignments to the `regex` variable are the state transitions.\n while (lastIndex < s.length) {\n // Make sure we start searching from where we previously left off\n regex.lastIndex = lastIndex;\n match = regex.exec(s);\n if (match === null) {\n break;\n }\n lastIndex = regex.lastIndex;\n if (regex === textEndRegex) {\n if (match[COMMENT_START] === '!--') {\n regex = commentEndRegex;\n } else if (match[COMMENT_START] !== undefined) {\n // We started a weird comment, like </{\n regex = comment2EndRegex;\n } else if (match[TAG_NAME] !== undefined) {\n if (rawTextElement.test(match[TAG_NAME])) {\n // Record if we encounter a raw-text element. We'll switch to\n // this regex at the end of the tag.\n rawTextEndRegex = new RegExp(`</${match[TAG_NAME]}`, 'g');\n }\n regex = tagEndRegex;\n } else if (match[DYNAMIC_TAG_NAME] !== undefined) {\n if (DEV_MODE) {\n throw new Error(\n 'Bindings in tag names are not supported. Please use static templates instead. ' +\n 'See https://lit.dev/docs/templates/expressions/#static-expressions'\n );\n }\n regex = tagEndRegex;\n }\n } else if (regex === tagEndRegex) {\n if (match[ENTIRE_MATCH] === '>') {\n // End of a tag. If we had started a raw-text element, use that\n // regex\n regex = rawTextEndRegex ?? textEndRegex;\n // We may be ending an unquoted attribute value, so make sure we\n // clear any pending attrNameEndIndex\n attrNameEndIndex = -1;\n } else if (match[ATTRIBUTE_NAME] === undefined) {\n // Attribute name position\n attrNameEndIndex = -2;\n } else {\n attrNameEndIndex = regex.lastIndex - match[SPACES_AND_EQUALS].length;\n attrName = match[ATTRIBUTE_NAME];\n regex =\n match[QUOTE_CHAR] === undefined\n ? tagEndRegex\n : match[QUOTE_CHAR] === '\"'\n ? doubleQuoteAttrEndRegex\n : singleQuoteAttrEndRegex;\n }\n } else if (\n regex === doubleQuoteAttrEndRegex ||\n regex === singleQuoteAttrEndRegex\n ) {\n regex = tagEndRegex;\n } else if (regex === commentEndRegex || regex === comment2EndRegex) {\n regex = textEndRegex;\n } else {\n // Not one of the five state regexes, so it must be the dynamically\n // created raw text regex and we're at the close of that element.\n regex = tagEndRegex;\n rawTextEndRegex = undefined;\n }\n }\n\n if (DEV_MODE) {\n // If we have a attrNameEndIndex, which indicates that we should\n // rewrite the attribute name, assert that we're in a valid attribute\n // position - either in a tag, or a quoted attribute value.\n console.assert(\n attrNameEndIndex === -1 ||\n regex === tagEndRegex ||\n regex === singleQuoteAttrEndRegex ||\n regex === doubleQuoteAttrEndRegex,\n 'unexpected parse state B'\n );\n }\n\n // We have four cases:\n // 1. We're in text position, and not in a raw text element\n // (regex === textEndRegex): insert a comment marker.\n // 2. We have a non-negative attrNameEndIndex which means we need to\n // rewrite the attribute name to add a bound attribute suffix.\n // 3. We're at the non-first binding in a multi-binding attribute, use a\n // plain marker.\n // 4. We're somewhere else inside the tag. If we're in attribute name\n // position (attrNameEndIndex === -2), add a sequential suffix to\n // generate a unique attribute name.\n\n // Detect a binding next to self-closing tag end and insert a space to\n // separate the marker from the tag end:\n const end =\n regex === tagEndRegex && strings[i + 1].startsWith('/>') ? ' ' : '';\n html +=\n regex === textEndRegex\n ? s + nodeMarker\n : attrNameEndIndex >= 0\n ? (attrNames.push(attrName!),\n s.slice(0, attrNameEndIndex) +\n boundAttributeSuffix +\n s.slice(attrNameEndIndex)) +\n marker +\n end\n : s + marker + (attrNameEndIndex === -2 ? i : end);\n }\n\n const htmlResult: string | TrustedHTML =\n html +\n (strings[l] || '<?>') +\n (type === SVG_RESULT ? '</svg>' : type === MATHML_RESULT ? '</math>' : '');\n\n // Returned as an array for terseness\n return [trustFromTemplateString(strings, htmlResult), attrNames];\n};\n\n/** @internal */\nexport type {Template};\nclass Template {\n /** @internal */\n el!: HTMLTemplateElement;\n\n parts: Array<TemplatePart> = [];\n\n constructor(\n // This property needs to remain unminified.\n {strings, ['_$litType$']: type}: UncompiledTemplateResult,\n options?: RenderOptions\n ) {\n let node: Node | null;\n let nodeIndex = 0;\n let attrNameIndex = 0;\n const partCount = strings.length - 1;\n const parts = this.parts;\n\n // Create template element\n const [html, attrNames] = getTemplateHtml(strings, type);\n this.el = Template.createElement(html, options);\n walker.currentNode = this.el.content;\n\n // Re-parent SVG or MathML nodes into template root\n if (type === SVG_RESULT || type === MATHML_RESULT) {\n const wrapper = this.el.content.firstChild!;\n wrapper.replaceWith(...wrapper.childNodes);\n }\n\n // Walk the template to find binding markers and create TemplateParts\n while ((node = walker.nextNode()) !== null && parts.length < partCount) {\n if (node.nodeType === 1) {\n if (DEV_MODE) {\n const tag = (node as Element).localName;\n // Warn if `textarea` includes an expression and throw if `template`\n // does since these are not supported. We do this by checking\n // innerHTML for anything that looks like a marker. This catches\n // cases like bindings in textarea there markers turn into text nodes.\n if (\n /^(?:textarea|template)$/i!.test(tag) &&\n (node as Element).innerHTML.includes(marker)\n ) {\n const m =\n `Expressions are not supported inside \\`${tag}\\` ` +\n `elements. See https://lit.dev/msg/expression-in-${tag} for more ` +\n `information.`;\n if (tag === 'template') {\n throw new Error(m);\n } else issueWarning('', m);\n }\n }\n // TODO (justinfagnani): for attempted dynamic tag names, we don't\n // increment the bindingIndex, and it'll be off by 1 in the element\n // and off by two after it.\n if ((node as Element).hasAttributes()) {\n for (const name of (node as Element).getAttributeNames()) {\n if (name.endsWith(boundAttributeSuffix)) {\n const realName = attrNames[attrNameIndex++];\n const value = (node as Element).getAttribute(name)!;\n const statics = value.split(marker);\n const m = /([.?@])?(.*)/.exec(realName)!;\n parts.push({\n type: ATTRIBUTE_PART,\n index: nodeIndex,\n name: m[2],\n strings: statics,\n ctor:\n m[1] === '.'\n ? PropertyPart\n : m[1] === '?'\n ? BooleanAttributePart\n : m[1] === '@'\n ? EventPart\n : AttributePart,\n });\n (node as Element).removeAttribute(name);\n } else if (name.startsWith(marker)) {\n parts.push({\n type: ELEMENT_PART,\n index: nodeIndex,\n });\n (node as Element).removeAttribute(name);\n }\n }\n }\n // TODO (justinfagnani): benchmark the regex against testing for each\n // of the 3 raw text element names.\n if (rawTextElement.test((node as Element).tagName)) {\n // For raw text elements we need to split the text content on\n // markers, create a Text node for each segment, and create\n // a TemplatePart for each marker.\n const strings = (node as Element).textContent!.split(marker);\n const lastIndex = strings.length - 1;\n if (lastIndex > 0) {\n (node as Element).textContent = trustedTypes\n ? (trustedTypes.emptyScript as unknown as '')\n : '';\n // Generate a new text node for each literal section\n // These nodes are also used as the markers for child parts\n for (let i = 0; i < lastIndex; i++) {\n (node as Element).append(strings[i], createMarker());\n // Walk past the marker node we just added\n walker.nextNode();\n parts.push({type: CHILD_PART, index: ++nodeIndex});\n }\n // Note because this marker is added after the walker's current\n // node, it will be walked to in the outer loop (and ignored), so\n // we don't need to adjust nodeIndex here\n (node as Element).append(strings[lastIndex], createMarker());\n }\n }\n } else if (node.nodeType === 8) {\n const data = (node as Comment).data;\n if (data === markerMatch) {\n parts.push({type: CHILD_PART, index: nodeIndex});\n } else {\n let i = -1;\n while ((i = (node as Comment).data.indexOf(marker, i + 1)) !== -1) {\n // Comment node has a binding marker inside, make an inactive part\n // The binding won't work, but subsequent bindings will\n parts.push({type: COMMENT_PART, index: nodeIndex});\n // Move to the end of the match\n i += marker.length - 1;\n }\n }\n }\n nodeIndex++;\n }\n\n if (DEV_MODE) {\n // If there was a duplicate attribute on a tag, then when the tag is\n // parsed into an element the attribute gets de-duplicated. We can detect\n // this mismatch if we haven't precisely consumed every attribute name\n // when preparing the template. This works because `attrNames` is built\n // from the template string and `attrNameIndex` comes from processing the\n // resulting DOM.\n if (attrNames.length !== attrNameIndex) {\n throw new Error(\n `Detected duplicate attribute bindings. This occurs if your template ` +\n `has duplicate attributes on an element tag. For example ` +\n `\"<input ?disabled=\\${true} ?disabled=\\${false}>\" contains a ` +\n `duplicate \"disabled\" attribute. The error was detected in ` +\n `the following template: \\n` +\n '`' +\n strings.join('${...}') +\n '`'\n );\n }\n }\n\n // We could set walker.currentNode to another node here to prevent a memory\n // leak, but every time we prepare a template, we immediately render it\n // and re-use the walker in new TemplateInstance._clone().\n debugLogEvent &&\n debugLogEvent({\n kind: 'template prep',\n template: this,\n clonableTemplate: this.el,\n parts: this.parts,\n strings,\n });\n }\n\n // Overridden via `litHtmlPolyfillSupport` to provide platform support.\n /** @nocollapse */\n static createElement(html: TrustedHTML, _options?: RenderOptions) {\n const el = d.createElement('template');\n el.innerHTML = html as unknown as string;\n return el;\n }\n}\n\nexport interface Disconnectable {\n _$parent?: Disconnectable;\n _$disconnectableChildren?: Set<Disconnectable>;\n // Rather than hold connection state on instances, Disconnectables recursively\n // fetch the connection state from the RootPart they are connected in via\n // getters up the Disconnectable tree via _$parent references. This pushes the\n // cost of tracking the isConnected state to `AsyncDirectives`, and avoids\n // needing to pass all Disconnectables (parts, template instances, and\n // directives) their connection state each time it changes, which would be\n // costly for trees that have no AsyncDirectives.\n _$isConnected: boolean;\n}\n\nfunction resolveDirective(\n part: ChildPart | AttributePart | ElementPart,\n value: unknown,\n parent: DirectiveParent = part,\n attributeIndex?: number\n): unknown {\n // Bail early if the value is explicitly noChange. Note, this means any\n // nested directive is still attached and is not run.\n if (value === noChange) {\n return value;\n }\n let currentDirective =\n attributeIndex !== undefined\n ? (parent as AttributePart).__directives?.[attributeIndex]\n : (parent as ChildPart | ElementPart | Directive).__directive;\n const nextDirectiveConstructor = isPrimitive(value)\n ? undefined\n : // This property needs to remain unminified.\n (value as DirectiveResult)['_$litDirective$'];\n if (currentDirective?.constructor !== nextDirectiveConstructor) {\n // This property needs to remain unminified.\n currentDirective?.['_$notifyDirectiveConnectionChanged']?.(false);\n if (nextDirectiveConstructor === undefined) {\n currentDirective = undefined;\n } else {\n currentDirective = new nextDirectiveConstructor(part as PartInfo);\n currentDirective._$initialize(part, parent, attributeIndex);\n }\n if (attributeIndex !== undefined) {\n ((parent as AttributePart).__directives ??= [])[attributeIndex] =\n currentDirective;\n } else {\n (parent as ChildPart | Directive).__directive = currentDirective;\n }\n }\n if (currentDirective !== undefined) {\n value = resolveDirective(\n part,\n currentDirective._$resolve(part, (value as DirectiveResult).values),\n currentDirective,\n attributeIndex\n );\n }\n return value;\n}\n\nexport type {TemplateInstance};\n/**\n * An updateable instance of a Template. Holds references to the Parts used to\n * update the template instance.\n */\nclass TemplateInstance implements Disconnectable {\n _$template: Template;\n _$parts: Array<Part | undefined> = [];\n\n /** @internal */\n _$parent: ChildPart;\n /** @internal */\n _$disconnectableChildren?: Set<Disconnectable> = undefined;\n\n constructor(template: Template, parent: ChildPart) {\n this._$template = template;\n this._$parent = parent;\n }\n\n // Called by ChildPart parentNode getter\n get parentNode() {\n return this._$parent.parentNode;\n }\n\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n\n // This method is separate from the constructor because we need to return a\n // DocumentFragment and we don't want to hold onto it with an instance field.\n _clone(options: RenderOptions | undefined) {\n const {\n el: {content},\n parts: parts,\n } = this._$template;\n const fragment = (options?.creationScope ?? d).importNode(content, true);\n walker.currentNode = fragment;\n\n let node = walker.nextNode()!;\n let nodeIndex = 0;\n let partIndex = 0;\n let templatePart = parts[0];\n\n while (templatePart !== undefined) {\n if (nodeIndex === templatePart.index) {\n let part: Part | undefined;\n if (templatePart.type === CHILD_PART) {\n part = new ChildPart(\n node as HTMLElement,\n node.nextSibling,\n this,\n options\n );\n } else if (templatePart.type === ATTRIBUTE_PART) {\n part = new templatePart.ctor(\n node as HTMLElement,\n templatePart.name,\n templatePart.strings,\n this,\n options\n );\n } else if (templatePart.type === ELEMENT_PART) {\n part = new ElementPart(node as HTMLElement, this, options);\n }\n this._$parts.push(part);\n templatePart = parts[++partIndex];\n }\n if (nodeIndex !== templatePart?.index) {\n node = walker.nextNode()!;\n nodeIndex++;\n }\n }\n // We need to set the currentNode away from the cloned tree so that we\n // don't hold onto the tree even if the tree is detached and should be\n // freed.\n walker.currentNode = d;\n return fragment;\n }\n\n _update(values: Array<unknown>) {\n let i = 0;\n for (const part of this._$parts) {\n if (part !== undefined) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'set part',\n part,\n value: values[i],\n valueIndex: i,\n values,\n templateInstance: this,\n });\n if ((part as AttributePart).strings !== undefined) {\n (part as AttributePart)._$setValue(values, part as AttributePart, i);\n // The number of values the part consumes is part.strings.length - 1\n // since values are in between template spans. We increment i by 1\n // later in the loop, so increment it by part.strings.length - 2 here\n i += (part as AttributePart).strings!.length - 2;\n } else {\n part._$setValue(values[i]);\n }\n }\n i++;\n }\n }\n}\n\n/*\n * Parts\n */\ntype AttributeTemplatePart = {\n readonly type: typeof ATTRIBUTE_PART;\n readonly index: number;\n readonly name: string;\n readonly ctor: typeof AttributePart;\n readonly strings: ReadonlyArray<string>;\n};\ntype ChildTemplatePart = {\n readonly type: typeof CHILD_PART;\n readonly index: number;\n};\ntype ElementTemplatePart = {\n readonly type: typeof ELEMENT_PART;\n readonly index: number;\n};\ntype CommentTemplatePart = {\n readonly type: typeof COMMENT_PART;\n readonly index: number;\n};\n\n/**\n * A TemplatePart represents a dynamic part in a template, before the template\n * is instantiated. When a template is instantiated Parts are created from\n * TemplateParts.\n */\ntype TemplatePart =\n | ChildTemplatePart\n | AttributeTemplatePart\n | ElementTemplatePart\n | CommentTemplatePart;\n\nexport type Part =\n | ChildPart\n | AttributePart\n | PropertyPart\n | BooleanAttributePart\n | ElementPart\n | EventPart;\n\nexport type {ChildPart};\nclass ChildPart implements Disconnectable {\n readonly type = CHILD_PART;\n readonly options: RenderOptions | undefined;\n _$committedValue: unknown = nothing;\n /** @internal */\n __directive?: Directive;\n /** @internal */\n _$startNode: ChildNode;\n /** @internal */\n _$endNode: ChildNode | null;\n private _textSanitizer: ValueSanitizer | undefined;\n /** @internal */\n _$parent: Disconnectable | undefined;\n /**\n * Connection state for RootParts only (i.e. ChildPart without _$parent\n * returned from top-level `render`). This field is unused otherwise. The\n * intention would be clearer if we made `RootPart` a subclass of `ChildPart`\n * with this field (and a different _$isConnected getter), but the subclass\n * caused a perf regression, possibly due to making call sites polymorphic.\n * @internal\n */\n __isConnected: boolean;\n\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n // ChildParts that are not at the root should always be created with a\n // parent; only RootChildNode's won't, so they return the local isConnected\n // state\n return this._$parent?._$isConnected ?? this.__isConnected;\n }\n\n // The following fields will be patched onto ChildParts when required by\n // AsyncDirective\n /** @internal */\n _$disconnectableChildren?: Set<Disconnectable> = undefined;\n /** @internal */\n _$notifyConnectionChanged?(\n isConnected: boolean,\n removeFromParent?: boolean,\n from?: number\n ): void;\n /** @internal */\n _$reparentDisconnectables?(parent: Disconnectable): void;\n\n constructor(\n startNode: ChildNode,\n endNode: ChildNode | null,\n parent: TemplateInstance | ChildPart | undefined,\n options: RenderOptions | undefined\n ) {\n this._$startNode = startNode;\n this._$endNode = endNode;\n this._$parent = parent;\n this.options = options;\n // Note __isConnected is only ever accessed on RootParts (i.e. when there is\n // no _$parent); the value on a non-root-part is \"don't care\", but checking\n // for parent would be more code\n this.__isConnected = options?.isConnected ?? true;\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n // Explicitly initialize for consistent class shape.\n this._textSanitizer = undefined;\n }\n }\n\n /**\n * The parent node into which the part renders its content.\n *\n * A ChildPart's content consists of a range of adjacent child nodes of\n * `.parentNode`, possibly bordered by 'marker nodes' (`.startNode` and\n * `.endNode`).\n *\n * - If both `.startNode` and `.endNode` are non-null, then the part's content\n * consists of all siblings between `.startNode` and `.endNode`, exclusively.\n *\n * - If `.startNode` is non-null but `.endNode` is null, then the part's\n * content consists of all siblings following `.startNode`, up to and\n * including the last child of `.parentNode`. If `.endNode` is non-null, then\n * `.startNode` will always be non-null.\n *\n * - If both `.endNode` and `.startNode` are null, then the part's content\n * consists of all child nodes of `.parentNode`.\n */\n get parentNode(): Node {\n let parentNode: Node = wrap(this._$startNode).parentNode!;\n const parent = this._$parent;\n if (\n parent !== undefined &&\n parentNode?.nodeType === 11 /* Node.DOCUMENT_FRAGMENT */\n ) {\n // If the parentNode is a DocumentFragment, it may be because the DOM is\n // still in the cloned fragment during initial render; if so, get the real\n // parentNode the part will be committed into by asking the parent.\n parentNode = (parent as ChildPart | TemplateInstance).parentNode;\n }\n return parentNode;\n }\n\n /**\n * The part's leading marker node, if any. See `.parentNode` for more\n * information.\n */\n get startNode(): Node | null {\n return this._$startNode;\n }\n\n /**\n * The part's trailing marker node, if any. See `.parentNode` for more\n * information.\n */\n get endNode(): Node | null {\n return this._$endNode;\n }\n\n _$setValue(value: unknown, directiveParent: DirectiveParent = this): void {\n if (DEV_MODE && this.parentNode === null) {\n throw new Error(\n `This \\`ChildPart\\` has no \\`parentNode\\` and therefore cannot accept a value. This likely means the element containing the part was manipulated in an unsupported way outside of Lit's control such that the part's marker nodes were ejected from DOM. For example, setting the element's \\`innerHTML\\` or \\`textContent\\` can do this.`\n );\n }\n value = resolveDirective(this, value, directiveParent);\n if (isPrimitive(value)) {\n // Non-rendering child values. It's important that these do not render\n // empty text nodes to avoid issues with preventing default <slot>\n // fallback content.\n if (value === nothing || value == null || value === '') {\n if (this._$committedValue !== nothing) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit nothing to child',\n start: this._$startNode,\n end: this._$endNode,\n parent: this._$parent,\n options: this.options,\n });\n this._$clear();\n }\n this._$committedValue = nothing;\n } else if (value !== this._$committedValue && value !== noChange) {\n this._commitText(value);\n }\n // This property needs to remain unminified.\n } else if ((value as TemplateResult)['_$litType$'] !== undefined) {\n this._commitTemplateResult(value as TemplateResult);\n } else if ((value as Node).nodeType !== undefined) {\n if (DEV_MODE && this.options?.host === value) {\n this._commitText(\n `[probable mistake: rendered a template's host in itself ` +\n `(commonly caused by writing \\${this} in a template]`\n );\n console.warn(\n `Attempted to render the template host`,\n value,\n `inside itself. This is almost always a mistake, and in dev mode `,\n `we render some warning text. In production however, we'll `,\n `render it, which will usually result in an error, and sometimes `,\n `in the element disappearing from the DOM.`\n );\n return;\n }\n this._commitNode(value as Node);\n } else if (isIterable(value)) {\n this._commitIterable(value);\n } else {\n // Fallback, will render the string representation\n this._commitText(value);\n }\n }\n\n private _insert<T extends Node>(node: T) {\n return wrap(wrap(this._$startNode).parentNode!).insertBefore(\n node,\n this._$endNode\n );\n }\n\n private _commitNode(value: Node): void {\n if (this._$committedValue !== value) {\n this._$clear();\n if (\n ENABLE_EXTRA_SECURITY_HOOKS &&\n sanitizerFactoryInternal !== noopSanitizer\n ) {\n const parentNodeName = this._$startNode.parentNode?.nodeName;\n if (parentNodeName === 'STYLE' || parentNodeName === 'SCRIPT') {\n let message = 'Forbidden';\n if (DEV_MODE) {\n if (parentNodeName === 'STYLE') {\n message =\n `Lit does not support binding inside style nodes. ` +\n `This is a security risk, as style injection attacks can ` +\n `exfiltrate data and spoof UIs. ` +\n `Consider instead using css\\`...\\` literals ` +\n `to compose styles, and do dynamic styling with ` +\n `css custom properties, ::parts, <slot>s, ` +\n `and by mutating the DOM rather than stylesheets.`;\n } else {\n message =\n `Lit does not support binding inside script nodes. ` +\n `This is a security risk, as it could allow arbitrary ` +\n `code execution.`;\n }\n }\n throw new Error(message);\n }\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit node',\n start: this._$startNode,\n parent: this._$parent,\n value: value,\n options: this.options,\n });\n this._$committedValue = this._insert(value);\n }\n }\n\n private _commitText(value: unknown): void {\n // If the committed value is a primitive it means we called _commitText on\n // the previous render, and we know that this._$startNode.nextSibling is a\n // Text node. We can now just replace the text content (.data) of the node.\n if (\n this._$committedValue !== nothing &&\n isPrimitive(this._$committedValue)\n ) {\n const node = wrap(this._$startNode).nextSibling as Text;\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n if (this._textSanitizer === undefined) {\n this._textSanitizer = createSanitizer(node, 'data', 'property');\n }\n value = this._textSanitizer(value);\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit text',\n node,\n value,\n options: this.options,\n });\n (node as Text).data = value as string;\n } else {\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n const textNode = d.createTextNode('');\n this._commitNode(textNode);\n // When setting text content, for security purposes it matters a lot\n // what the parent is. For example, <style> and <script> need to be\n // handled with care, while <span> does not. So first we need to put a\n // text node into the document, then we can sanitize its content.\n if (this._textSanitizer === undefined) {\n this._textSanitizer = createSanitizer(textNode, 'data', 'property');\n }\n value = this._textSanitizer(value);\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit text',\n node: textNode,\n value,\n options: this.options,\n });\n textNode.data = value as string;\n } else {\n this._commitNode(d.createTextNode(value as string));\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit text',\n node: wrap(this._$startNode).nextSibling as Text,\n value,\n options: this.options,\n });\n }\n }\n this._$committedValue = value;\n }\n\n private _commitTemplateResult(\n result: TemplateResult | CompiledTemplateResult\n ): void {\n // This property needs to remain unminified.\n const {values, ['_$litType$']: type} = result;\n // If $litType$ is a number, result is a plain TemplateResult and we get\n // the template from the template cache. If not, result is a\n // CompiledTemplateResult and _$litType$ is a CompiledTemplate and we need\n // to create the <template> element the first time we see it.\n const template: Template | CompiledTemplate =\n typeof type === 'number'\n ? this._$getTemplate(result as UncompiledTemplateResult)\n : (type.el === undefined &&\n (type.el = Template.createElement(\n trustFromTemplateString(type.h, type.h[0]),\n this.options\n )),\n type);\n\n if ((this._$committedValue as TemplateInstance)?._$template === template) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'template updating',\n template,\n instance: this._$committedValue as TemplateInstance,\n parts: (this._$committedValue as TemplateInstance)._$parts,\n options: this.options,\n values,\n });\n (this._$committedValue as TemplateInstance)._update(values);\n } else {\n const instance = new TemplateInstance(template as Template, this);\n const fragment = instance._clone(this.options);\n debugLogEvent &&\n debugLogEvent({\n kind: 'template instantiated',\n template,\n instance,\n parts: instance._$parts,\n options: this.options,\n fragment,\n values,\n });\n instance._update(values);\n debugLogEvent &&\n debugLogEvent({\n kind: 'template instantiated and updated',\n template,\n instance,\n parts: instance._$parts,\n options: this.options,\n fragment,\n values,\n });\n this._commitNode(fragment);\n this._$committedValue = instance;\n }\n }\n\n // Overridden via `litHtmlPolyfillSupport` to provide platform support.\n /** @internal */\n _$getTemplate(result: UncompiledTemplateResult) {\n let template = templateCache.get(result.strings);\n if (template === undefined) {\n templateCache.set(result.strings, (template = new Template(result)));\n }\n return template;\n }\n\n private _commitIterable(value: Iterable<unknown>): void {\n // For an Iterable, we create a new InstancePart per item, then set its\n // value to the item. This is a little bit of overhead for every item in\n // an Iterable, but it lets us recurse easily and efficiently update Arrays\n // of TemplateResults that will be commonly returned from expressions like:\n // array.map((i) => html`${i}`), by reusing existing TemplateInstances.\n\n // If value is an array, then the previous render was of an\n // iterable and value will contain the ChildParts from the previous\n // render. If value is not an array, clear this part and make a new\n // array for ChildParts.\n if (!isArray(this._$committedValue)) {\n this._$committedValue = [];\n this._$clear();\n }\n\n // Lets us keep track of how many items we stamped so we can clear leftover\n // items from a previous render\n const itemParts = this._$committedValue as ChildPart[];\n let partIndex = 0;\n let itemPart: ChildPart | undefined;\n\n for (const item of value) {\n if (partIndex === itemParts.length) {\n // If no existing part, create a new one\n // TODO (justinfagnani): test perf impact of always creating two parts\n // instead of sharing parts between nodes\n // https://github.com/lit/lit/issues/1266\n itemParts.push(\n (itemPart = new ChildPart(\n this._insert(createMarker()),\n this._insert(createMarker()),\n this,\n this.options\n ))\n );\n } else {\n // Reuse an existing part\n itemPart = itemParts[partIndex];\n }\n itemPart._$setValue(item);\n partIndex++;\n }\n\n if (partIndex < itemParts.length) {\n // itemParts always have end nodes\n this._$clear(\n itemPart && wrap(itemPart._$endNode!).nextSibling,\n partIndex\n );\n // Truncate the parts array so _value reflects the current state\n itemParts.length = partIndex;\n }\n }\n\n /**\n * Removes the nodes contained within this Part from the DOM.\n *\n * @param start Start node to clear from, for clearing a subset of the part's\n * DOM (used when truncating iterables)\n * @param from When `start` is specified, the index within the iterable from\n * which ChildParts are being removed, used for disconnecting directives\n * in those Parts.\n *\n * @internal\n */\n _$clear(\n start: ChildNode | null = wrap(this._$startNode).nextSibling,\n from?: number\n ) {\n this._$notifyConnectionChanged?.(false, true, from);\n while (start !== this._$endNode) {\n // The non-null assertion is safe because if _$startNode.nextSibling is\n // null, then _$endNode is also null, and we would not have entered this\n // loop.\n const n = wrap(start!).nextSibling;\n wrap(start!).remove();\n start = n;\n }\n }\n\n /**\n * Implementation of RootPart's `isConnected`. Note that this method\n * should only be called on `RootPart`s (the `ChildPart` returned from a\n * top-level `render()` call). It has no effect on non-root ChildParts.\n * @param isConnected Whether to set\n * @internal\n */\n setConnected(isConnected: boolean) {\n if (this._$parent === undefined) {\n this.__isConnected = isConnected;\n this._$notifyConnectionChanged?.(isConnected);\n } else if (DEV_MODE) {\n throw new Error(\n 'part.setConnected() may only be called on a ' +\n 'RootPart returned from render().'\n );\n }\n }\n}\n\n/**\n * A top-level `ChildPart` returned from `render` that manages the connected\n * state of `AsyncDirective`s created throughout the tree below it.\n */\nexport interface RootPart extends ChildPart {\n /**\n * Sets the connection state for `AsyncDirective`s contained within this root\n * ChildPart.\n *\n * lit-html does not automatically monitor the connectedness of DOM rendered;\n * as such, it is the responsibility of the caller to `render` to ensure that\n * `part.setConnected(false)` is called before the part object is potentially\n * discarded, to ensure that `AsyncDirective`s have a chance to dispose of\n * any resources being held. If a `RootPart` that was previously\n * disconnected is subsequently re-connected (and its `AsyncDirective`s should\n * re-connect), `setConnected(true)` should be called.\n *\n * @param isConnected Whether directives within this tree should be connected\n * or not\n */\n setConnected(isConnected: boolean): void;\n}\n\nexport type {AttributePart};\nclass AttributePart implements Disconnectable {\n readonly type:\n | typeof ATTRIBUTE_PART\n | typeof PROPERTY_PART\n | typeof BOOLEAN_ATTRIBUTE_PART\n | typeof EVENT_PART = ATTRIBUTE_PART;\n readonly element: HTMLElement;\n readonly name: string;\n readonly options: RenderOptions | undefined;\n\n /**\n * If this attribute part represents an interpolation, this contains the\n * static strings of the interpolation. For single-value, complete bindings,\n * this is undefined.\n */\n readonly strings?: ReadonlyArray<string>;\n /** @internal */\n _$committedValue: unknown | Array<unknown> = nothing;\n /** @internal */\n __directives?: Array<Directive | undefined>;\n /** @internal */\n _$parent: Disconnectable;\n /** @internal */\n _$disconnectableChildren?: Set<Disconnectable> = undefined;\n\n protected _sanitizer: ValueSanitizer | undefined;\n\n get tagName() {\n return this.element.tagName;\n }\n\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n\n constructor(\n element: HTMLElement,\n name: string,\n strings: ReadonlyArray<string>,\n parent: Disconnectable,\n options: RenderOptions | undefined\n ) {\n this.element = element;\n this.name = name;\n this._$parent = parent;\n this.options = options;\n if (strings.length > 2 || strings[0] !== '' || strings[1] !== '') {\n this._$committedValue = new Array(strings.length - 1).fill(new String());\n this.strings = strings;\n } else {\n this._$committedValue = nothing;\n }\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n this._sanitizer = undefined;\n }\n }\n\n /**\n * Sets the value of this part by resolving the value from possibly multiple\n * values and static strings and committing it to the DOM.\n * If this part is single-valued, `this._strings` will be undefined, and the\n * method will be called with a single value argument. If this part is\n * multi-value, `this._strings` will be defined, and the method is called\n * with the value array of the part's owning TemplateInstance, and an offset\n * into the value array from which the values should be read.\n * This method is overloaded this way to eliminate short-lived array slices\n * of the template instance values, and allow a fast-path for single-valued\n * parts.\n *\n * @param value The part value, or an array of values for multi-valued parts\n * @param valueIndex the index to start reading values from. `undefined` for\n * single-valued parts\n * @param noCommit causes the part to not commit its value to the DOM. Used\n * in hydration to prime attribute parts with their first-rendered value,\n * but not set the attribute, and in SSR to no-op the DOM operation and\n * capture the value for serialization.\n *\n * @internal\n */\n _$setValue(\n value: unknown | Array<unknown>,\n directiveParent: DirectiveParent = this,\n valueIndex?: number,\n noCommit?: boolean\n ) {\n const strings = this.strings;\n\n // Whether any of the values has changed, for dirty-checking\n let change = false;\n\n if (strings === undefined) {\n // Single-value binding case\n value = resolveDirective(this, value, directiveParent, 0);\n change =\n !isPrimitive(value) ||\n (value !== this._$committedValue && value !== noChange);\n if (change) {\n this._$committedValue = value;\n }\n } else {\n // Interpolation case\n const values = value as Array<unknown>;\n value = strings[0];\n\n let i, v;\n for (i = 0; i < strings.length - 1; i++) {\n v = resolveDirective(this, values[valueIndex! + i], directiveParent, i);\n\n if (v === noChange) {\n // If the user-provided value is `noChange`, use the previous value\n v = (this._$committedValue as Array<unknown>)[i];\n }\n change ||=\n !isPrimitive(v) || v !== (this._$committedValue as Array<unknown>)[i];\n if (v === nothing) {\n value = nothing;\n } else if (value !== nothing) {\n value += (v ?? '') + strings[i + 1];\n }\n // We always record each value, even if one is `nothing`, for future\n // change detection.\n (this._$committedValue as Array<unknown>)[i] = v;\n }\n }\n if (change && !noCommit) {\n this._commitValue(value);\n }\n }\n\n /** @internal */\n _commitValue(value: unknown) {\n if (value === nothing) {\n (wrap(this.element) as Element).removeAttribute(this.name);\n } else {\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n if (this._sanitizer === undefined) {\n this._sanitizer = sanitizerFactoryInternal(\n this.element,\n this.name,\n 'attribute'\n );\n }\n value = this._sanitizer(value ?? '');\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit attribute',\n element: this.element,\n name: this.name,\n value,\n options: this.options,\n });\n (wrap(this.element) as Element).setAttribute(\n this.name,\n (value ?? '') as string\n );\n }\n }\n}\n\nexport type {PropertyPart};\nclass PropertyPart extends AttributePart {\n override readonly type = PROPERTY_PART;\n\n /** @internal */\n override _commitValue(value: unknown) {\n if (ENABLE_EXTRA_SECURITY_HOOKS) {\n if (this._sanitizer === undefined) {\n this._sanitizer = sanitizerFactoryInternal(\n this.element,\n this.name,\n 'property'\n );\n }\n value = this._sanitizer(value);\n }\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit property',\n element: this.element,\n name: this.name,\n value,\n options: this.options,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.element as any)[this.name] = value === nothing ? undefined : value;\n }\n}\n\nexport type {BooleanAttributePart};\nclass BooleanAttributePart extends AttributePart {\n override readonly type = BOOLEAN_ATTRIBUTE_PART;\n\n /** @internal */\n override _commitValue(value: unknown) {\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit boolean attribute',\n element: this.element,\n name: this.name,\n value: !!(value && value !== nothing),\n options: this.options,\n });\n (wrap(this.element) as Element).toggleAttribute(\n this.name,\n !!value && value !== nothing\n );\n }\n}\n\ntype EventListenerWithOptions = EventListenerOrEventListenerObject &\n Partial<AddEventListenerOptions>;\n\n/**\n * An AttributePart that manages an event listener via add/removeEventListener.\n *\n * This part works by adding itself as the event listener on an element, then\n * delegating to the value passed to it. This reduces the number of calls to\n * add/removeEventListener if the listener changes frequently, such as when an\n * inline function is used as a listener.\n *\n * Because event options are passed when adding listeners, we must take case\n * to add and remove the part as a listener when the event options change.\n */\nexport type {EventPart};\nclass EventPart extends AttributePart {\n override readonly type = EVENT_PART;\n\n constructor(\n element: HTMLElement,\n name: string,\n strings: ReadonlyArray<string>,\n parent: Disconnectable,\n options: RenderOptions | undefined\n ) {\n super(element, name, strings, parent, options);\n\n if (DEV_MODE && this.strings !== undefined) {\n throw new Error(\n `A \\`<${element.localName}>\\` has a \\`@${name}=...\\` listener with ` +\n 'invalid content. Event listeners in templates must have exactly ' +\n 'one expression and no surrounding text.'\n );\n }\n }\n\n // EventPart does not use the base _$setValue/_resolveValue implementation\n // since the dirty checking is more complex\n /** @internal */\n override _$setValue(\n newListener: unknown,\n directiveParent: DirectiveParent = this\n ) {\n newListener =\n resolveDirective(this, newListener, directiveParent, 0) ?? nothing;\n if (newListener === noChange) {\n return;\n }\n const oldListener = this._$committedValue;\n\n // If the new value is nothing or any options change we have to remove the\n // part as a listener.\n const shouldRemoveListener =\n (newListener === nothing && oldListener !== nothing) ||\n (newListener as EventListenerWithOptions).capture !==\n (oldListener as EventListenerWithOptions).capture ||\n (newListener as EventListenerWithOptions).once !==\n (oldListener as EventListenerWithOptions).once ||\n (newListener as EventListenerWithOptions).passive !==\n (oldListener as EventListenerWithOptions).passive;\n\n // If the new value is not nothing and we removed the listener, we have\n // to add the part as a listener.\n const shouldAddListener =\n newListener !== nothing &&\n (oldListener === nothing || shouldRemoveListener);\n\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit event listener',\n element: this.element,\n name: this.name,\n value: newListener,\n options: this.options,\n removeListener: shouldRemoveListener,\n addListener: shouldAddListener,\n oldListener,\n });\n if (shouldRemoveListener) {\n this.element.removeEventListener(\n this.name,\n this,\n oldListener as EventListenerWithOptions\n );\n }\n if (shouldAddListener) {\n this.element.addEventListener(\n this.name,\n this,\n newListener as EventListenerWithOptions\n );\n }\n this._$committedValue = newListener;\n }\n\n handleEvent(event: Event) {\n if (typeof this._$committedValue === 'function') {\n this._$committedValue.call(this.options?.host ?? this.element, event);\n } else {\n (this._$committedValue as EventListenerObject).handleEvent(event);\n }\n }\n}\n\nexport type {ElementPart};\nclass ElementPart implements Disconnectable {\n readonly type = ELEMENT_PART;\n\n /** @internal */\n __directive?: Directive;\n\n // This is to ensure that every Part has a _$committedValue\n _$committedValue: undefined;\n\n /** @internal */\n _$parent!: Disconnectable;\n\n /** @internal */\n _$disconnectableChildren?: Set<Disconnectable> = undefined;\n\n options: RenderOptions | undefined;\n\n constructor(\n public element: Element,\n parent: Disconnectable,\n options: RenderOptions | undefined\n ) {\n this._$parent = parent;\n this.options = options;\n }\n\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n\n _$setValue(value: unknown): void {\n debugLogEvent &&\n debugLogEvent({\n kind: 'commit to element binding',\n element: this.element,\n value,\n options: this.options,\n });\n resolveDirective(this, value);\n }\n}\n\n/**\n * END USERS SHOULD NOT RELY ON THIS OBJECT.\n *\n * Private exports for use by other Lit packages, not intended for use by\n * external users.\n *\n * We currently do not make a mangled rollup build of the lit-ssr code. In order\n * to keep a number of (otherwise private) top-level exports mangled in the\n * client side code, we export a _$LH object containing those members (or\n * helper methods for accessing private fields of those members), and then\n * re-export them for use in lit-ssr. This keeps lit-ssr agnostic to whether the\n * client-side code is being used in `dev` mode or `prod` mode.\n *\n * This has a unique name, to disambiguate it from private exports in\n * lit-element, which re-exports all of lit-html.\n *\n * @private\n */\nexport const _$LH = {\n // Used in lit-ssr\n _boundAttributeSuffix: boundAttributeSuffix,\n _marker: marker,\n _markerMatch: markerMatch,\n _HTML_RESULT: HTML_RESULT,\n _getTemplateHtml: getTemplateHtml,\n // Used in tests and private-ssr-support\n _TemplateInstance: TemplateInstance,\n _isIterable: isIterable,\n _resolveDirective: resolveDirective,\n _ChildPart: ChildPart,\n _AttributePart: AttributePart,\n _BooleanAttributePart: BooleanAttributePart,\n _EventPart: EventPart,\n _PropertyPart: PropertyPart,\n _ElementPart: ElementPart,\n};\n\n// Apply polyfills if available\nconst polyfillSupport = DEV_MODE\n ? global.litHtmlPolyfillSupportDevMode\n : global.litHtmlPolyfillSupport;\npolyfillSupport?.(Template, ChildPart);\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for lit-html usage.\n(global.litHtmlVersions ??= []).push('3.3.2');\nif (DEV_MODE && global.litHtmlVersions.length > 1) {\n queueMicrotask(() => {\n issueWarning!(\n 'multiple-versions',\n `Multiple versions of Lit loaded. ` +\n `Loading multiple versions is not recommended.`\n );\n });\n}\n\n/**\n * Renders a value, usually a lit-html TemplateResult, to the container.\n *\n * This example renders the text \"Hello, Zoe!\" inside a paragraph tag, appending\n * it to the container `document.body`.\n *\n * ```js\n * import {html, render} from 'lit';\n *\n * const name = \"Zoe\";\n * render(html`<p>Hello, ${name}!</p>`, document.body);\n * ```\n *\n * @param value Any [renderable\n * value](https://lit.dev/docs/templates/expressions/#child-expressions),\n * typically a {@linkcode TemplateResult} created by evaluating a template tag\n * like {@linkcode html} or {@linkcode svg}.\n * @param container A DOM container to render to. The first render will append\n * the rendered value to the container, and subsequent renders will\n * efficiently update the rendered value if the same result type was\n * previously rendered there.\n * @param options See {@linkcode RenderOptions} for options documentation.\n * @see\n * {@link https://lit.dev/docs/libraries/standalone-templates/#rendering-lit-html-templates| Rendering Lit HTML Templates}\n */\nexport const render = (\n value: unknown,\n container: RenderRootNode,\n options?: RenderOptions\n): RootPart => {\n if (DEV_MODE && container == null) {\n // Give a clearer error message than\n // Uncaught TypeError: Cannot read properties of null (reading\n // '_$litPart$')\n // which reads like an internal Lit error.\n throw new TypeError(`The container to render into may not be ${container}`);\n }\n const renderId = DEV_MODE ? debugLogRenderId++ : 0;\n const partOwnerNode = options?.renderBefore ?? container;\n // This property needs to remain unminified.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let part: ChildPart = (partOwnerNode as any)['_$litPart$'];\n debugLogEvent &&\n debugLogEvent({\n kind: 'begin render',\n id: renderId,\n value,\n container,\n options,\n part,\n });\n if (part === undefined) {\n const endNode = options?.renderBefore ?? null;\n // This property needs to remain unminified.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (partOwnerNode as any)['_$litPart$'] = part = new ChildPart(\n container.insertBefore(createMarker(), endNode),\n endNode,\n undefined,\n options ?? {}\n );\n }\n part._$setValue(value);\n debugLogEvent &&\n debugLogEvent({\n kind: 'end render',\n id: renderId,\n value,\n container,\n options,\n part,\n });\n return part as RootPart;\n};\n\nif (ENABLE_EXTRA_SECURITY_HOOKS) {\n render.setSanitizer = setSanitizer;\n render.createSanitizer = createSanitizer;\n if (DEV_MODE) {\n render._testOnlyClearSanitizerFactoryDoNotCallOrElse =\n _testOnlyClearSanitizerFactoryDoNotCallOrElse;\n }\n}\n"],"mappings":"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","names":["global","globalThis","wrap","node","trustedTypes","policy","createPolicy","createHTML","s","boundAttributeSuffix","marker","Math","random","toFixed","slice","markerMatch","nodeMarker","d","document","createTreeWalker","createMarker","createComment","isPrimitive","value","isArray","Array","isIterable","Symbol","iterator","SPACE_CHAR","textEndRegex","commentEndRegex","comment2EndRegex","tagEndRegex","RegExp","singleQuoteAttrEndRegex","doubleQuoteAttrEndRegex","rawTextElement","tag","type","strings","values","_$litType$","html","svg","mathml","noChange","for","nothing","templateCache","WeakMap","walker","trustFromTemplateString","tsa","stringFromTSA","hasOwnProperty","Error","getTemplateHtml","l","length","attrNames","rawTextEndRegex","regex","i","attrName","match","attrNameEndIndex","lastIndex","exec","test","end","startsWith","push","Template","constructor","options","this","parts","nodeIndex","attrNameIndex","partCount","el","createElement","currentNode","content","wrapper","firstChild","replaceWith","childNodes","nextNode","nodeType","hasAttributes","name","getAttributeNames","endsWith","realName","statics","getAttribute","split","m","index","ctor","PropertyPart","BooleanAttributePart","EventPart","AttributePart","removeAttribute","tagName","textContent","emptyScript","append","data","indexOf","_options","innerHTML","resolveDirective","part","parent","attributeIndex","currentDirective","__directives","__directive","nextDirectiveConstructor","_$initialize","_$resolve","TemplateInstance","template","_$parts","_$disconnectableChildren","_$template","_$parent","parentNode","_$isConnected","fragment","creationScope","importNode","partIndex","templatePart","ChildPart","nextSibling","ElementPart","_$setValue","__isConnected","startNode","endNode","_$committedValue","_$startNode","_$endNode","isConnected","directiveParent","_$clear","_commitText","_commitTemplateResult","_commitNode","_commitIterable","insertBefore","_insert","createTextNode","result","_$getTemplate","h","_update","instance","_clone","get","set","itemParts","itemPart","item","start","from","_$notifyConnectionChanged","n","remove","element","fill","String","valueIndex","noCommit","change","v","_commitValue","setAttribute","toggleAttribute","super","newListener","oldListener","shouldRemoveListener","capture","once","passive","shouldAddListener","removeEventListener","addEventListener","event","call","host","handleEvent","_$LH","_boundAttributeSuffix","_marker","_markerMatch","_HTML_RESULT","_getTemplateHtml","_TemplateInstance","_isIterable","_resolveDirective","_ChildPart","_AttributePart","_BooleanAttributePart","_EventPart","_PropertyPart","_ElementPart","polyfillSupport","litHtmlPolyfillSupport","litHtmlVersions","render","container","partOwnerNode","renderBefore","query","d","k","v","n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-H46AZIKM.js.map"}
+310
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-H4FCSW7J.js
··· 1 + import { 2 + BroadcastableDiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + batch, 6 + computed, 7 + signal 8 + } from "./chunk-IZOBPV2S.js"; 9 + import { 10 + __name, 11 + init_Buffer, 12 + init_process 13 + } from "./chunk-FZQXS3RE.js"; 14 + 15 + // components/configurator/output/element.js 16 + init_Buffer(); 17 + init_process(); 18 + var STORAGE_PREFIX = "diffuse/configurator/output"; 19 + var OutputConfigurator = class extends BroadcastableDiffuseElement { 20 + static { 21 + __name(this, "OutputConfigurator"); 22 + } 23 + static NAME = "diffuse/configurator/output"; 24 + constructor() { 25 + super(); 26 + const manager = { 27 + facets: { 28 + collection: computed(() => { 29 + const out = this.#selectedOutput.value; 30 + if (out) return out.facets.collection(); 31 + const def = this.#defaultOutput.value; 32 + if (def) return def.facets.collection(); 33 + return this.#memory.facets.value; 34 + }), 35 + reload: /* @__PURE__ */ __name(() => { 36 + const def = this.#defaultOutput.value; 37 + if (def) def.facets.reload(); 38 + const out = this.#selectedOutput.value; 39 + if (out) return out.facets.reload(); 40 + return Promise.resolve(); 41 + }, "reload"), 42 + save: /* @__PURE__ */ __name(async (newFacets) => { 43 + const out = this.#selectedOutput.value; 44 + if (out) return await out.facets.save(newFacets); 45 + const def = this.#defaultOutput.value; 46 + if (def) return await def.facets.save(newFacets); 47 + this.#memory.facets.value = newFacets; 48 + }, "save"), 49 + state: computed(() => { 50 + const out = this.#selectedOutput.value; 51 + if (out) return out.facets.state(); 52 + const def = this.#defaultOutput.value; 53 + if (def) return def.facets.state(); 54 + return this.#setupFinished.value ? "loaded" : "sleeping"; 55 + }) 56 + }, 57 + playlists: { 58 + collection: computed(() => { 59 + const out = this.#selectedOutput.value; 60 + if (out) return out.playlists.collection(); 61 + const def = this.#defaultOutput.value; 62 + if (def) return def.playlists.collection(); 63 + return this.#memory.playlists.value; 64 + }), 65 + reload: /* @__PURE__ */ __name(() => { 66 + const def = this.#defaultOutput.value; 67 + if (def) def.playlists.reload(); 68 + const out = this.#selectedOutput.value; 69 + if (out) return out.playlists.reload(); 70 + return Promise.resolve(); 71 + }, "reload"), 72 + save: /* @__PURE__ */ __name(async (newPlaylists) => { 73 + const out = this.#selectedOutput.value; 74 + if (out) return await out.playlists.save(newPlaylists); 75 + const def = this.#defaultOutput.value; 76 + if (def) return await def.playlists.save(newPlaylists); 77 + this.#memory.playlists.value = newPlaylists; 78 + }, "save"), 79 + state: computed(() => { 80 + const out = this.#selectedOutput.value; 81 + if (out) return out.playlists.state(); 82 + const def = this.#defaultOutput.value; 83 + if (def) return def.playlists.state(); 84 + return this.#setupFinished.value ? "loaded" : "sleeping"; 85 + }) 86 + }, 87 + themes: { 88 + collection: computed(() => { 89 + const out = this.#selectedOutput.value; 90 + if (out) return out.themes.collection(); 91 + const def = this.#defaultOutput.value; 92 + if (def) return def.themes.collection(); 93 + return this.#memory.themes.value; 94 + }), 95 + reload: /* @__PURE__ */ __name(() => { 96 + const def = this.#defaultOutput.value; 97 + if (def) def.themes.reload(); 98 + const out = this.#selectedOutput.value; 99 + if (out) return out.themes.reload(); 100 + return Promise.resolve(); 101 + }, "reload"), 102 + save: /* @__PURE__ */ __name(async (newThemes) => { 103 + const out = this.#selectedOutput.value; 104 + if (out) return await out.themes.save(newThemes); 105 + const def = this.#defaultOutput.value; 106 + if (def) return await def.themes.save(newThemes); 107 + this.#memory.themes.value = newThemes; 108 + }, "save"), 109 + state: computed(() => { 110 + const out = this.#selectedOutput.value; 111 + if (out) return out.themes.state(); 112 + const def = this.#defaultOutput.value; 113 + if (def) return def.themes.state(); 114 + return this.#setupFinished.value ? "loaded" : "sleeping"; 115 + }) 116 + }, 117 + tracks: { 118 + collection: computed(() => { 119 + const out = this.#selectedOutput.value; 120 + if (out) return out.tracks.collection(); 121 + const def = this.#defaultOutput.value; 122 + if (def) return def.tracks.collection(); 123 + return this.#memory.tracks.value; 124 + }), 125 + reload: /* @__PURE__ */ __name(() => { 126 + const def = this.#defaultOutput.value; 127 + if (def) def.tracks.reload(); 128 + const out = this.#selectedOutput.value; 129 + if (out) return out.tracks.reload(); 130 + return Promise.resolve(); 131 + }, "reload"), 132 + save: /* @__PURE__ */ __name(async (newTracks) => { 133 + const out = this.#selectedOutput.value; 134 + if (out) return await out.tracks.save(newTracks); 135 + const def = this.#defaultOutput.value; 136 + if (def) return await def.tracks.save(newTracks); 137 + this.#memory.tracks.value = newTracks; 138 + }, "save"), 139 + state: computed(() => { 140 + const out = this.#selectedOutput.value; 141 + if (out) return out.tracks.state(); 142 + const def = this.#defaultOutput.value; 143 + if (def) return def.tracks.state(); 144 + return this.#setupFinished.value ? "loaded" : "sleeping"; 145 + }) 146 + }, 147 + // Other 148 + ready: computed(() => { 149 + const out = this.#selectedOutput.value; 150 + if (out) return out.ready(); 151 + const def = this.#defaultOutput.value; 152 + if (def) return def.ready(); 153 + return this.#setupFinished.value; 154 + }) 155 + }; 156 + this.facets = manager.facets; 157 + this.playlists = manager.playlists; 158 + this.themes = manager.themes; 159 + this.tracks = manager.tracks; 160 + this.ready = manager.ready; 161 + } 162 + // SIGNALS 163 + #defaultOutput = signal( 164 + /** @type {Output | null | undefined} */ 165 + void 0 166 + ); 167 + #memory = { 168 + facets: signal( 169 + /** @type {Facet[]} */ 170 + [] 171 + ), 172 + playlists: signal( 173 + /** @type {Playlist[]} */ 174 + [] 175 + ), 176 + themes: signal( 177 + /** @type {Theme[]} */ 178 + [] 179 + ), 180 + tracks: signal( 181 + /** @type {Track[]} */ 182 + [] 183 + ) 184 + }; 185 + #selectedOutput = signal( 186 + /** @type {Output | null | undefined} */ 187 + void 0 188 + ); 189 + #setupFinished = signal(false); 190 + // STATE 191 + selectedOutput = computed(() => this.#selectedOutput.value ?? null); 192 + // LIFECYCLE 193 + /** 194 + * @override 195 + */ 196 + async connectedCallback() { 197 + if (this.hasAttribute("group")) { 198 + const actions = this.broadcast(this.nameWithGroup, { 199 + selectOutput: { 200 + strategy: "replicate", 201 + fn: this.#selectOutput 202 + } 203 + }); 204 + if (actions) { 205 + this.#selectOutput = actions.selectOutput; 206 + } 207 + } 208 + super.connectedCallback(); 209 + let defaultOutput = void 0; 210 + const def_ault = this.getAttribute("default"); 211 + if (def_ault) { 212 + defaultOutput = await this.#findOutput(def_ault); 213 + } 214 + const selectedOutput = await this.#findSelectedOutput(); 215 + batch(() => { 216 + this.#selectedOutput.value = selectedOutput; 217 + this.#defaultOutput.value = defaultOutput; 218 + this.#setupFinished.value = true; 219 + }); 220 + } 221 + // MISC 222 + /** 223 + * @param {string | null} id 224 + */ 225 + #selectOutput = /* @__PURE__ */ __name(async (id) => { 226 + this.#selectedOutput.value = await this.#findOutput(id); 227 + }, "#selectOutput"); 228 + /** 229 + * @param {string | null} id 230 + */ 231 + async #findOutput(id) { 232 + const el = id ? this.root().querySelector(`#${id}`) : null; 233 + if (!el) return null; 234 + await customElements.whenDefined(el.localName); 235 + if ("nameWithGroup" in el === false || "tracks" in el === false) { 236 + return null; 237 + } 238 + return ( 239 + /** @type {Output} */ 240 + /** @type {unknown} */ 241 + el 242 + ); 243 + } 244 + async #findSelectedOutput() { 245 + const id = localStorage.getItem(`${STORAGE_PREFIX}/selected/id`); 246 + if (id) return this.#findOutput(id); 247 + return void 0; 248 + } 249 + /** 250 + * @override 251 + */ 252 + dependencies = /* @__PURE__ */ __name(() => { 253 + return Object.fromEntries( 254 + Array.from(this.root().children).flatMap((element) => { 255 + if (element.hasAttribute("id") === false) { 256 + console.warn( 257 + "Missing `id` for output configurator child element with `localName` '" + element.localName + "'" 258 + ); 259 + return []; 260 + } 261 + const d = ( 262 + /** @type {DiffuseElement} */ 263 + element 264 + ); 265 + return [[d.id, d]]; 266 + }) 267 + ); 268 + }, "dependencies"); 269 + // ADDITIONAL ACTIONS 270 + deselect = /* @__PURE__ */ __name(async () => { 271 + localStorage.removeItem(`${STORAGE_PREFIX}/selected/id`); 272 + await this.#selectOutput(null); 273 + }, "deselect"); 274 + options = /* @__PURE__ */ __name(async () => { 275 + const deps = this.dependencies(); 276 + const entries = Object.entries(deps); 277 + await Promise.all( 278 + entries.map(([_k, v]) => customElements.whenDefined(v.localName)) 279 + ); 280 + return entries.map(([k, v]) => { 281 + return { 282 + id: k, 283 + label: v.label, 284 + element: ( 285 + /** @type {OutputElement} */ 286 + v 287 + ) 288 + }; 289 + }); 290 + }, "options"); 291 + /** 292 + * @param {string} id 293 + */ 294 + select = /* @__PURE__ */ __name(async (id) => { 295 + localStorage.setItem(`${STORAGE_PREFIX}/selected/id`, id); 296 + await this.#selectOutput(id); 297 + }, "select"); 298 + }; 299 + var element_default = OutputConfigurator; 300 + var CLASS = OutputConfigurator; 301 + var NAME = "dc-output"; 302 + customElements.define(NAME, CLASS); 303 + 304 + export { 305 + element_default, 306 + CLASS, 307 + NAME 308 + }; 309 + 310 + //# sourceMappingURL=./chunk-H4FCSW7J.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-H4FCSW7J.js.map
··· 1 + {"version":3,"sources":["/components/configurator/output/element.js"],"sourcesContent":["import {\n BroadcastableDiffuseElement,\n DiffuseElement,\n} from \"@common/element.js\";\nimport { batch, computed, signal } from \"@common/signal.js\";\n\n/**\n * @import {Facet, Playlist, Theme, Track} from \"@definitions/types.d.ts\"\n * @import {OutputManagerDeputy, OutputElement} from \"@components/output/types.d.ts\"\n *\n * @import {OutputConfiguratorElement} from \"./types.d.ts\"\n */\n\n/**\n * @typedef {OutputElement} Output\n */\n\nconst STORAGE_PREFIX = \"diffuse/configurator/output\";\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {OutputConfiguratorElement}\n */\nclass OutputConfigurator extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/configurator/output\";\n\n constructor() {\n super();\n\n /** @type {OutputManagerDeputy} */\n const manager = {\n facets: {\n collection: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.facets.collection();\n\n const def = this.#defaultOutput.value;\n if (def) return def.facets.collection();\n\n return this.#memory.facets.value;\n }),\n reload: () => {\n const def = this.#defaultOutput.value;\n if (def) def.facets.reload();\n\n const out = this.#selectedOutput.value;\n if (out) return out.facets.reload();\n\n return Promise.resolve();\n },\n save: async (newFacets) => {\n const out = this.#selectedOutput.value;\n if (out) return await out.facets.save(newFacets);\n\n const def = this.#defaultOutput.value;\n if (def) return await def.facets.save(newFacets);\n\n this.#memory.facets.value = newFacets;\n },\n state: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.facets.state();\n\n const def = this.#defaultOutput.value;\n if (def) return def.facets.state();\n\n return this.#setupFinished.value ? \"loaded\" : \"sleeping\";\n }),\n },\n playlists: {\n collection: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.playlists.collection();\n\n const def = this.#defaultOutput.value;\n if (def) return def.playlists.collection();\n\n return this.#memory.playlists.value;\n }),\n reload: () => {\n const def = this.#defaultOutput.value;\n if (def) def.playlists.reload();\n\n const out = this.#selectedOutput.value;\n if (out) return out.playlists.reload();\n\n return Promise.resolve();\n },\n save: async (newPlaylists) => {\n const out = this.#selectedOutput.value;\n if (out) return await out.playlists.save(newPlaylists);\n\n const def = this.#defaultOutput.value;\n if (def) return await def.playlists.save(newPlaylists);\n\n this.#memory.playlists.value = newPlaylists;\n },\n state: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.playlists.state();\n\n const def = this.#defaultOutput.value;\n if (def) return def.playlists.state();\n\n return this.#setupFinished.value ? \"loaded\" : \"sleeping\";\n }),\n },\n themes: {\n collection: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.themes.collection();\n\n const def = this.#defaultOutput.value;\n if (def) return def.themes.collection();\n\n return this.#memory.themes.value;\n }),\n reload: () => {\n const def = this.#defaultOutput.value;\n if (def) def.themes.reload();\n\n const out = this.#selectedOutput.value;\n if (out) return out.themes.reload();\n\n return Promise.resolve();\n },\n save: async (newThemes) => {\n const out = this.#selectedOutput.value;\n if (out) return await out.themes.save(newThemes);\n\n const def = this.#defaultOutput.value;\n if (def) return await def.themes.save(newThemes);\n\n this.#memory.themes.value = newThemes;\n },\n state: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.themes.state();\n\n const def = this.#defaultOutput.value;\n if (def) return def.themes.state();\n\n return this.#setupFinished.value ? \"loaded\" : \"sleeping\";\n }),\n },\n tracks: {\n collection: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.tracks.collection();\n\n const def = this.#defaultOutput.value;\n if (def) return def.tracks.collection();\n\n return this.#memory.tracks.value;\n }),\n reload: () => {\n const def = this.#defaultOutput.value;\n if (def) def.tracks.reload();\n\n const out = this.#selectedOutput.value;\n if (out) return out.tracks.reload();\n\n return Promise.resolve();\n },\n save: async (newTracks) => {\n const out = this.#selectedOutput.value;\n if (out) return await out.tracks.save(newTracks);\n\n const def = this.#defaultOutput.value;\n if (def) return await def.tracks.save(newTracks);\n\n this.#memory.tracks.value = newTracks;\n },\n state: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.tracks.state();\n\n const def = this.#defaultOutput.value;\n if (def) return def.tracks.state();\n\n return this.#setupFinished.value ? \"loaded\" : \"sleeping\";\n }),\n },\n\n // Other\n ready: computed(() => {\n const out = this.#selectedOutput.value;\n if (out) return out.ready();\n\n const def = this.#defaultOutput.value;\n if (def) return def.ready();\n\n return this.#setupFinished.value;\n }),\n };\n\n // Assign manager properties to class\n this.facets = manager.facets;\n this.playlists = manager.playlists;\n this.themes = manager.themes;\n this.tracks = manager.tracks;\n this.ready = manager.ready;\n }\n\n // SIGNALS\n\n #defaultOutput = signal(\n /** @type {Output | null | undefined} */ (undefined),\n );\n\n #memory = {\n facets: signal(/** @type {Facet[]} */ ([])),\n playlists: signal(/** @type {Playlist[]} */ ([])),\n themes: signal(/** @type {Theme[]} */ ([])),\n tracks: signal(/** @type {Track[]} */ ([])),\n };\n\n #selectedOutput = signal(\n /** @type {Output | null | undefined} */ (undefined),\n );\n\n #setupFinished = signal(false);\n\n // STATE\n\n selectedOutput = computed(() => this.#selectedOutput.value ?? null);\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n selectOutput: {\n strategy: \"replicate\",\n fn: this.#selectOutput,\n },\n });\n\n if (actions) {\n this.#selectOutput = actions.selectOutput;\n }\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {Output | null | undefined} */\n let defaultOutput = undefined;\n\n const def_ault = this.getAttribute(\"default\");\n if (def_ault) {\n defaultOutput = await this.#findOutput(def_ault);\n }\n\n const selectedOutput = await this.#findSelectedOutput();\n\n batch(() => {\n this.#selectedOutput.value = selectedOutput;\n this.#defaultOutput.value = defaultOutput;\n this.#setupFinished.value = true;\n });\n }\n\n // MISC\n\n /**\n * @param {string | null} id\n */\n #selectOutput = async (id) => {\n this.#selectedOutput.value = await this.#findOutput(id);\n };\n\n /**\n * @param {string | null} id\n */\n async #findOutput(id) {\n const el = id ? this.root().querySelector(`#${id}`) : null;\n if (!el) return null;\n\n await customElements.whenDefined(el.localName);\n\n if (\n \"nameWithGroup\" in el === false ||\n \"tracks\" in el === false\n ) {\n return null;\n }\n\n return /** @type {Output} */ (/** @type {unknown} */ (el));\n }\n\n async #findSelectedOutput() {\n const id = localStorage.getItem(`${STORAGE_PREFIX}/selected/id`);\n if (id) return this.#findOutput(id);\n return undefined;\n }\n\n /**\n * @override\n */\n dependencies = () => {\n return Object.fromEntries(\n Array.from(this.root().children).flatMap((element) => {\n if (element.hasAttribute(\"id\") === false) {\n console.warn(\n \"Missing `id` for output configurator child element with `localName` '\" +\n element.localName + \"'\",\n );\n return [];\n }\n\n const d = /** @type {DiffuseElement} */ (element);\n return [[d.id, d]];\n }),\n );\n };\n\n // ADDITIONAL ACTIONS\n\n deselect = async () => {\n localStorage.removeItem(`${STORAGE_PREFIX}/selected/id`);\n await this.#selectOutput(null);\n };\n\n options = async () => {\n const deps = this.dependencies();\n const entries = Object.entries(deps);\n\n await Promise.all(\n entries.map(([_k, v]) => customElements.whenDefined(v.localName)),\n );\n\n return entries.map(([k, v]) => {\n return {\n id: k,\n label: v.label,\n element: /** @type {OutputElement} */ (v),\n };\n });\n };\n\n /**\n * @param {string} id\n */\n select = async (id) => {\n localStorage.setItem(`${STORAGE_PREFIX}/selected/id`, id);\n await this.#selectOutput(id);\n };\n}\n\nexport default OutputConfigurator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = OutputConfigurator;\nexport const NAME = \"dc-output\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-H4FCSW7J.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-H6TRVIGW.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-H6TRVIGW.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-H6TRVIGW.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-H6TRVIGW.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-HN4F5JEZ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-HN4F5JEZ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js.map
+530
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-HRFK436L.js
··· 1 + import { 2 + NAME 3 + } from "./chunk-NMCS5TQK.js"; 4 + import { 5 + NAME as NAME2 6 + } from "./chunk-OIQMICML.js"; 7 + import { 8 + A, 9 + DiffuseElement, 10 + query 11 + } from "./chunk-H46AZIKM.js"; 12 + import { 13 + signal 14 + } from "./chunk-IZOBPV2S.js"; 15 + import { 16 + __name, 17 + init_Buffer, 18 + init_process 19 + } from "./chunk-FZQXS3RE.js"; 20 + 21 + // themes/webamp/configurators/output/element.js 22 + init_Buffer(); 23 + init_process(); 24 + var OutputConfig = class extends DiffuseElement { 25 + static { 26 + __name(this, "OutputConfig"); 27 + } 28 + constructor() { 29 + super(); 30 + this.attachShadow({ mode: "open" }); 31 + } 32 + // SIGNALS 33 + $output = signal( 34 + /** @type {OutputElement | OutputConfiguratorElement<VariousOutputElements> | undefined} */ 35 + void 0 36 + ); 37 + $atproto = signal( 38 + /** @type {ATProtoOutputElement | null} */ 39 + null 40 + ); 41 + $s3 = signal( 42 + /** @type {S3OutputElement | null} */ 43 + null 44 + ); 45 + $tab = signal("overview"); 46 + // LIFECYCLE 47 + /** @override */ 48 + async connectedCallback() { 49 + super.connectedCallback(); 50 + const output = query(this, "output-selector"); 51 + await customElements.whenDefined(output.localName); 52 + this.$output.value = output; 53 + const atproto = output.root().querySelector(NAME2); 54 + if (atproto) { 55 + this.$atproto.value = /** @type {ATProtoOutputElement} */ 56 + atproto; 57 + } 58 + const s3 = output.root().querySelector(NAME); 59 + if (s3) { 60 + this.$s3.value = /** @type {S3OutputElement} */ 61 + s3; 62 + } 63 + } 64 + // EVENTS 65 + /** @param {Event} event */ 66 + #handleAtprotoLogin = /* @__PURE__ */ __name(async (event) => { 67 + event.preventDefault(); 68 + const input = this.root().querySelector("#atproto-handle"); 69 + const handle = input?.value?.trim(); 70 + if (!handle) return; 71 + const atproto = this.$atproto.value; 72 + if (!atproto) return; 73 + const button = this.root().querySelector("#atproto-submit"); 74 + if (button) button.disabled = true; 75 + await atproto.login(handle); 76 + }, "#handleAtprotoLogin"); 77 + #handleAtprotoLogout = /* @__PURE__ */ __name(async () => { 78 + const atproto = this.$atproto.value; 79 + if (!atproto) return; 80 + await atproto.logout(); 81 + }, "#handleAtprotoLogout"); 82 + #handleAtprotoActivate = /* @__PURE__ */ __name(async () => { 83 + const output = this.$output.value; 84 + if (!output || !("select" in output)) return; 85 + const atproto = this.$atproto.value; 86 + if (!atproto) return; 87 + const option = (await output.options()).find( 88 + (o) => o.label === "AT Protocol" 89 + ); 90 + if (option) await output.select(option.id); 91 + }, "#handleAtprotoActivate"); 92 + /** 93 + * @param {Event} event 94 + */ 95 + #handleS3SetBucket = /* @__PURE__ */ __name(async (event) => { 96 + event.preventDefault(); 97 + const s3 = this.$s3.value; 98 + if (!s3) return; 99 + const button = this.root().querySelector("#s3-submit"); 100 + if (button) button.disabled = true; 101 + const accessKey = ( 102 + /** @type {HTMLInputElement | null} */ 103 + this.root().querySelector( 104 + "#s3-access-key" 105 + )?.value 106 + ); 107 + const bucketName = ( 108 + /** @type {HTMLInputElement | null} */ 109 + this.root().querySelector( 110 + "#s3-bucket-name" 111 + )?.value 112 + ); 113 + const host = ( 114 + /** @type {HTMLInputElement | null} */ 115 + this.root().querySelector( 116 + "#s3-host" 117 + )?.value 118 + ); 119 + const path = ( 120 + /** @type {HTMLInputElement | null} */ 121 + this.root().querySelector( 122 + "#s3-path" 123 + )?.value 124 + ); 125 + const region = ( 126 + /** @type {HTMLInputElement | null} */ 127 + this.root().querySelector( 128 + "#s3-region" 129 + )?.value 130 + ); 131 + const secretKey = ( 132 + /** @type {HTMLInputElement | null} */ 133 + this.root().querySelector( 134 + "#s3-secret-key" 135 + )?.value 136 + ); 137 + if (!accessKey || !bucketName || !secretKey) return; 138 + const bucket = { 139 + accessKey, 140 + bucketName, 141 + host: host?.length ? host : "s3.amazonaws.com", 142 + path: path?.length ? path : "/", 143 + region: region?.length ? region : "us-east-1", 144 + secretKey 145 + }; 146 + await s3.setBucket(bucket); 147 + if (button) button.disabled = false; 148 + }, "#handleS3SetBucket"); 149 + #handleS3Unset = /* @__PURE__ */ __name(async () => { 150 + const s3 = this.$s3.value; 151 + if (!s3) return; 152 + await s3.unsetBucket(); 153 + }, "#handleS3Unset"); 154 + #handleS3Activate = /* @__PURE__ */ __name(async () => { 155 + const output = this.$output.value; 156 + if (!output || !("select" in output)) return; 157 + const s3 = this.$s3.value; 158 + if (!s3) return; 159 + const option = (await output.options()).find((o) => o.label === "S3"); 160 + if (option) await output.select(option.id); 161 + }, "#handleS3Activate"); 162 + #handleDeactivate = /* @__PURE__ */ __name(async () => { 163 + const output = this.$output.value; 164 + if (!output || !("deselect" in output)) return; 165 + await output.deselect(); 166 + }, "#handleDeactivate"); 167 + // RENDER 168 + /** 169 + * @param {RenderArg} _ 170 + */ 171 + render({ html }) { 172 + return html` 173 + <link rel="stylesheet" href="styles/vendor/98.css" /> 174 + <link rel="stylesheet" href="themes/webamp/98-extra.css" /> 175 + 176 + <style> 177 + @import "./themes/webamp/98-vars.css"; 178 + 179 + .button-row { 180 + display: inline-flex; 181 + gap: var(--grouped-button-spacing); 182 + } 183 + 184 + #tabbed { 185 + display: flex; 186 + flex-direction: column; 187 + height: 100%; 188 + } 189 + 190 + .window { 191 + flex: 1; 192 + overflow-y: auto; 193 + } 194 + 195 + /* TABS */ 196 + 197 + menu[role="tablist"] { 198 + padding-top: 2px; 199 + 200 + li > label { 201 + cursor: pointer; 202 + display: block; 203 + padding: var(--radio-label-spacing); 204 + } 205 + 206 + li[aria-selected="true"] { 207 + padding-bottom: 2px; 208 + margin-top: -2px; 209 + background-color: var(--surface); 210 + position: relative; 211 + z-index: 8; 212 + margin-left: -3px; 213 + } 214 + } 215 + </style> 216 + 217 + <div id="tabbed"> 218 + <menu role="tablist" class="multirows"> 219 + <li role="tab" aria-selected="${this.$tab.value === "overview"}"> 220 + <label @click="${() => this.$tab.value = "overview"}"> 221 + <span>Overview</span> 222 + </label> 223 + </li> 224 + <li role="tab" aria-selected="${this.$tab.value === "atproto"}"> 225 + <label @click="${() => this.$tab.value = "atproto"}"> 226 + <span>AT Protocol</span> 227 + </label> 228 + </li> 229 + <li role="tab" aria-selected="${this.$tab.value === "s3"}"> 230 + <label @click="${() => this.$tab.value = "s3"}"> 231 + <span>S3</span> 232 + </label> 233 + </li> 234 + </menu> 235 + 236 + <div class="window" role="tabpanel"> 237 + ${this.#renderTab(html)} 238 + </div> 239 + </div> 240 + `; 241 + } 242 + /** 243 + * @param {RenderArg["html"]} html 244 + */ 245 + #renderTab(html) { 246 + switch (this.$tab.value) { 247 + case "overview": 248 + return this.#renderOverviewTab(html); 249 + case "atproto": 250 + return this.#renderAtprotoTab(html); 251 + case "s3": 252 + return this.#renderS3Tab(html); 253 + default: 254 + return A; 255 + } 256 + } 257 + /** 258 + * @param {RenderArg["html"]} html 259 + */ 260 + #renderOverviewTab(html) { 261 + const selectedOutput = this.$output.value && "selectedOutput" in this.$output.value ? this.$output.value.selectedOutput() : void 0; 262 + return html` 263 + <div class="window-body"> 264 + <fieldset> 265 + <span class="with-icon with-icon--large"> 266 + <img 267 + src="images/icons/windows_98/computer_user_pencil-0.png" 268 + width="24" 269 + /> 270 + <span>Here you can configure where to keep your user data.<br />Each 271 + storage method comes with its pros and cons.<br />By default your data 272 + is only kept locally here in the browser. 273 + </span> 274 + </span> 275 + </fieldset> 276 + 277 + <fieldset> 278 + <span class="with-icon with-icon--large"> 279 + <img 280 + src="images/icons/windows_98/msg_information-0.png" 281 + width="24" 282 + /> 283 + <span> 284 + Data does not transfer across storage methods!<br />You can however 285 + merge data between them though, if you wish to do so. 286 + </span> 287 + </span> 288 + </fieldset> 289 + 290 + <fieldset> 291 + <legend>Active storage method</legend> 292 + <div class="with-icon with-icon--large"> 293 + <img 294 + src="images/icons/windows_98/${selectedOutput ? `directory_channels-2.png` : `msg_warning-0.png`}" 295 + width="24" 296 + /> 297 + <div> 298 + ${this.$output.value && "selectedOutput" in this.$output.value ? selectedOutput ? html` 299 + <p> 300 + Selected output: 301 + <strong>${selectedOutput.label}</strong><br /> 302 + </p> 303 + <p> 304 + <button @click="${this.#handleDeactivate}">Deactivate</button> 305 + </p> 306 + ` : this.#defaultOutputMessage : this.#defaultOutputMessage} 307 + </div> 308 + </div> 309 + </fieldset> 310 + </div> 311 + `; 312 + } 313 + /** 314 + * @param {RenderArg["html"]} html 315 + */ 316 + #renderAtprotoTab(html) { 317 + const did = this.$atproto.value?.did() ?? null; 318 + const selectedOutput = this.$output.value && "selectedOutput" in this.$output.value ? this.$output.value.selectedOutput() : void 0; 319 + const authenticated = /* @__PURE__ */ __name(() => { 320 + return html` 321 + <fieldset> 322 + <span class="with-icon with-icon--large"> 323 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 324 + <span>Signed in as <strong>${did}</strong></span> 325 + </span> 326 + </fieldset> 327 + 328 + <p class="button-row"> 329 + <button @click="${this.#handleAtprotoLogout}">Sign out</button> 330 + ${this.#renderAtprotoActivation(html, selectedOutput)} 331 + </p> 332 + `; 333 + }, "authenticated"); 334 + const unauthenticated = /* @__PURE__ */ __name(() => { 335 + return html` 336 + <fieldset> 337 + <span class="with-icon with-icon--large"> 338 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 339 + <span> 340 + Store your user data on the storage associated with your AT Protocol 341 + identity. 342 + </span> 343 + </span> 344 + </fieldset> 345 + 346 + <form @submit="${this.#handleAtprotoLogin}"> 347 + <fieldset> 348 + <div class="field-row"> 349 + <label for="atproto-handle">Your internet handle:</label> 350 + <input 351 + id="atproto-handle" 352 + type="text" 353 + required 354 + placeholder="you.bsky.social" 355 + /> 356 + </div> 357 + </fieldset> 358 + 359 + <p> 360 + <button type="submit" id="atproto-submit">Sign in</button> 361 + ${this.#renderAtprotoActivation(html, selectedOutput)} 362 + </p> 363 + </form> 364 + `; 365 + }, "unauthenticated"); 366 + return html` 367 + <div class="window-body"> 368 + ${did ? authenticated() : unauthenticated()} 369 + </div> 370 + `; 371 + } 372 + /** 373 + * @param {RenderArg["html"]} html 374 + */ 375 + #renderS3Tab(html) { 376 + const s3 = this.$s3.value; 377 + const ready = s3?.ready() ?? false; 378 + const selectedOutput = this.$output.value && "selectedOutput" in this.$output.value ? this.$output.value.selectedOutput() : void 0; 379 + const configured = /* @__PURE__ */ __name(() => { 380 + const bucket = s3?.bucket(); 381 + return html` 382 + <fieldset> 383 + <div class="with-icon with-icon--large"> 384 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 385 + <div> 386 + Bucket configured: 387 + <ul 388 + style="margin-bottom: 0; padding-left: 0; list-style-position: inside;" 389 + > 390 + <li>Name: <strong>${bucket?.bucketName}</strong></li> 391 + <li>Host: ${bucket?.host}</li> 392 + <li>Access key: ${bucket?.accessKey}</li> 393 + </ul> 394 + </div> 395 + </div> 396 + </fieldset> 397 + 398 + <fieldset> 399 + <span class="with-icon with-icon--large"> 400 + <img 401 + src="images/icons/windows_98/msg_information-0.png" 402 + width="24" 403 + /> 404 + <span> 405 + Make sure the bucket has CORS configured properly. 406 + </span> 407 + </span> 408 + </fieldset> 409 + 410 + <p class="button-row"> 411 + <button id="s3-unset-bucket" @click="${this.#handleS3Unset}"> 412 + Remove bucket configuration 413 + </button> 414 + ${this.#renderS3Activation(html, selectedOutput)} 415 + </p> 416 + `; 417 + }, "configured"); 418 + const unconfigured = /* @__PURE__ */ __name(() => { 419 + return html` 420 + <fieldset> 421 + <span class="with-icon with-icon--large"> 422 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 423 + <span> 424 + Store your user data on an S3-compatible storage service. 425 + </span> 426 + </span> 427 + </fieldset> 428 + 429 + <form @submit="${this.#handleS3SetBucket}"> 430 + <fieldset> 431 + <legend>Bucket details</legend> 432 + 433 + <div class="field-row"> 434 + <label for="s3-access-key">Access Key:*</label> 435 + <input type="text" id="s3-access-key" required /> 436 + </div> 437 + 438 + <div class="field-row"> 439 + <label for="s3-secret-key">Secret Key:*</label> 440 + <input type="password" id="s3-secret-key" required /> 441 + </div> 442 + 443 + <div class="field-row"> 444 + <label for="s3-bucket-name">Bucket Name:*</label> 445 + <input type="text" id="s3-bucket-name" required /> 446 + </div> 447 + 448 + <div class="field-row"> 449 + <label for="s3-host">Host:</label> 450 + <input 451 + type="text" 452 + id="s3-host" 453 + placeholder="s3.amazonaws.com" 454 + /> 455 + </div> 456 + 457 + <div class="field-row"> 458 + <label for="s3-region">Region:</label> 459 + <input 460 + type="text" 461 + id="s3-region" 462 + placeholder="us-east-1" 463 + /> 464 + </div> 465 + 466 + <div class="field-row"> 467 + <label for="s3-path">Path:</label> 468 + <input type="text" id="s3-path" /> 469 + </div> 470 + 471 + <p> 472 + * are required fields. 473 + </p> 474 + </fieldset> 475 + 476 + <p> 477 + <button type="submit" id="s3-submit">Set bucket</button> 478 + ${this.#renderS3Activation(html, selectedOutput)} 479 + </p> 480 + </form> 481 + `; 482 + }, "unconfigured"); 483 + return html` 484 + <div class="window-body"> 485 + ${ready ? configured() : unconfigured()} 486 + </div> 487 + `; 488 + } 489 + /** 490 + * @param {RenderArg['html']} html 491 + * @param {VariousOutputElements | null | undefined} selectedOutput 492 + */ 493 + #renderAtprotoActivation(html, selectedOutput) { 494 + const output = this.$output.value; 495 + if (!output || !("select" in output)) return A; 496 + const isActive = selectedOutput?.label === "AT Protocol"; 497 + return isActive ? html` 498 + <button @click="${this.#handleDeactivate}">Deactivate</button> 499 + ` : html` 500 + <button @click="${this.#handleAtprotoActivate}">Activate this storage</button> 501 + `; 502 + } 503 + /** 504 + * @param {RenderArg['html']} html 505 + * @param {VariousOutputElements | null | undefined} selectedOutput 506 + */ 507 + #renderS3Activation(html, selectedOutput) { 508 + const output = this.$output.value; 509 + if (!output || !("select" in output)) return A; 510 + const isActive = selectedOutput?.label === "S3"; 511 + return isActive ? html` 512 + <button @click="${this.#handleDeactivate}">Deactivate</button> 513 + ` : html` 514 + <button @click="${this.#handleS3Activate}">Activate this storage</button> 515 + `; 516 + } 517 + #defaultOutputMessage = "Storing data locally in the browser without any backup or syncing enabled."; 518 + }; 519 + var element_default = OutputConfig; 520 + var CLASS = OutputConfig; 521 + var NAME3 = "dtw-output-config"; 522 + customElements.define(NAME3, CLASS); 523 + 524 + export { 525 + element_default, 526 + CLASS, 527 + NAME3 as NAME 528 + }; 529 + 530 + //# sourceMappingURL=./chunk-HRFK436L.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-HRFK436L.js.map
··· 1 + {"version":3,"sources":["/themes/webamp/configurators/output/element.js"],"sourcesContent":["import { DiffuseElement, nothing, query } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\nimport { NAME as ATPROTO_NAME } from \"@components/output/raw/atproto/element.js\";\nimport { NAME as S3_NAME } from \"@components/output/bytes/s3/element.js\";\n\n/**\n * @import {ATProtoOutputElement} from \"@components/output/raw/atproto/types.d.ts\"\n *\n * @import {Bucket as S3Bucket} from \"@components/input/s3/types.d.ts\"\n * @import {S3OutputElement} from \"@components/output/bytes/s3/types.d.ts\"\n *\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n * @import {OutputConfiguratorElement, OutputOption} from \"@components/configurator/output/types.d.ts\"\n * @import {OutputFallbackConfiguratorElement} from \"@components/configurator/output-fallback/types.d.ts\"\n * @import {RenderArg} from \"@common/element.d.ts\"\n */\n\n/**\n * @typedef {OutputElement<any>} VariousOutputElements\n */\n\nclass OutputConfig extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n // SIGNALS\n\n $output = signal(\n /** @type {OutputElement | OutputConfiguratorElement<VariousOutputElements> | undefined} */ (undefined),\n );\n\n $atproto = signal(\n /** @type {ATProtoOutputElement | null} */ (null),\n );\n\n $s3 = signal(\n /** @type {S3OutputElement | null} */ (null),\n );\n\n $tab = signal(\"overview\");\n\n // LIFECYCLE\n\n /** @override */\n async connectedCallback() {\n super.connectedCallback();\n\n /** @type {OutputElement | OutputConfiguratorElement<VariousOutputElements>} */\n const output = query(this, \"output-selector\");\n\n await customElements.whenDefined(output.localName);\n\n this.$output.value = output;\n\n // Try setting up specific outputs\n const atproto = output.root().querySelector(ATPROTO_NAME);\n\n if (atproto) {\n this.$atproto.value = /** @type {ATProtoOutputElement} */ (atproto);\n }\n\n const s3 = output.root().querySelector(S3_NAME);\n\n if (s3) {\n this.$s3.value = /** @type {S3OutputElement} */ (s3);\n }\n }\n\n // EVENTS\n\n /** @param {Event} event */\n #handleAtprotoLogin = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLInputElement | null} */\n const input = this.root().querySelector(\"#atproto-handle\");\n const handle = input?.value?.trim();\n if (!handle) return;\n\n const atproto = this.$atproto.value;\n if (!atproto) return;\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#atproto-submit\");\n if (button) button.disabled = true;\n\n await atproto.login(handle);\n };\n\n #handleAtprotoLogout = async () => {\n const atproto = this.$atproto.value;\n if (!atproto) return;\n\n await atproto.logout();\n };\n\n #handleAtprotoActivate = async () => {\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return;\n\n const atproto = this.$atproto.value;\n if (!atproto) return;\n\n const option = (await output.options()).find((o) =>\n o.label === \"AT Protocol\"\n );\n if (option) await output.select(option.id);\n };\n\n /**\n * @param {Event} event\n */\n #handleS3SetBucket = async (event) => {\n event.preventDefault();\n\n const s3 = this.$s3.value;\n if (!s3) return;\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#s3-submit\");\n if (button) button.disabled = true;\n\n const accessKey =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-access-key\",\n ))?.value;\n const bucketName =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-bucket-name\",\n ))?.value;\n const host =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-host\",\n ))?.value;\n const path =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-path\",\n ))?.value;\n const region =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-region\",\n ))?.value;\n const secretKey =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-secret-key\",\n ))?.value;\n\n if (!accessKey || !bucketName || !secretKey) return;\n\n /** @type {S3Bucket} */\n const bucket = {\n accessKey,\n bucketName,\n host: host?.length ? host : \"s3.amazonaws.com\",\n path: path?.length ? path : \"/\",\n region: region?.length ? region : \"us-east-1\",\n secretKey,\n };\n\n await s3.setBucket(bucket);\n\n if (button) button.disabled = false;\n };\n\n #handleS3Unset = async () => {\n const s3 = this.$s3.value;\n if (!s3) return;\n\n await s3.unsetBucket();\n };\n\n #handleS3Activate = async () => {\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return;\n\n const s3 = this.$s3.value;\n if (!s3) return;\n\n const option = (await output.options()).find((o) => o.label === \"S3\");\n if (option) await output.select(option.id);\n };\n\n #handleDeactivate = async () => {\n const output = this.$output.value;\n if (!output || !(\"deselect\" in output)) return;\n\n await output.deselect();\n };\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <link rel=\"stylesheet\" href=\"styles/vendor/98.css\" />\n <link rel=\"stylesheet\" href=\"themes/webamp/98-extra.css\" />\n\n <style>\n @import \"./themes/webamp/98-vars.css\";\n\n .button-row {\n display: inline-flex;\n gap: var(--grouped-button-spacing);\n }\n\n #tabbed {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .window {\n flex: 1;\n overflow-y: auto;\n }\n\n /* TABS */\n\n menu[role=\"tablist\"] {\n padding-top: 2px;\n\n li > label {\n cursor: pointer;\n display: block;\n padding: var(--radio-label-spacing);\n }\n\n li[aria-selected=\"true\"] {\n padding-bottom: 2px;\n margin-top: -2px;\n background-color: var(--surface);\n position: relative;\n z-index: 8;\n margin-left: -3px;\n }\n }\n </style>\n\n <div id=\"tabbed\">\n <menu role=\"tablist\" class=\"multirows\">\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"overview\"}\">\n <label @click=\"${() => this.$tab.value = \"overview\"}\">\n <span>Overview</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"atproto\"}\">\n <label @click=\"${() => this.$tab.value = \"atproto\"}\">\n <span>AT Protocol</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"s3\"}\">\n <label @click=\"${() => this.$tab.value = \"s3\"}\">\n <span>S3</span>\n </label>\n </li>\n </menu>\n\n <div class=\"window\" role=\"tabpanel\">\n ${this.#renderTab(html)}\n </div>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderTab(html) {\n switch (this.$tab.value) {\n case \"overview\":\n return this.#renderOverviewTab(html);\n case \"atproto\":\n return this.#renderAtprotoTab(html);\n case \"s3\":\n return this.#renderS3Tab(html);\n default:\n return nothing;\n }\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderOverviewTab(html) {\n const selectedOutput =\n this.$output.value && \"selectedOutput\" in this.$output.value\n ? this.$output.value.selectedOutput()\n : undefined;\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/computer_user_pencil-0.png\"\n width=\"24\"\n />\n <span>Here you can configure where to keep your user data.<br />Each\n storage method comes with its pros and cons.<br />By default your data\n is only kept locally here in the browser.\n </span>\n </span>\n </fieldset>\n\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/msg_information-0.png\"\n width=\"24\"\n />\n <span>\n Data does not transfer across storage methods!<br />You can however\n merge data between them though, if you wish to do so.\n </span>\n </span>\n </fieldset>\n\n <fieldset>\n <legend>Active storage method</legend>\n <div class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/${selectedOutput\n ? `directory_channels-2.png`\n : `msg_warning-0.png`}\"\n width=\"24\"\n />\n <div>\n ${this.$output.value &&\n \"selectedOutput\" in this.$output.value\n ? selectedOutput\n ? html`\n <p>\n Selected output:\n <strong>${selectedOutput.label}</strong><br />\n </p>\n <p>\n <button @click=\"${this\n .#handleDeactivate}\">Deactivate</button>\n </p>\n `\n : this.#defaultOutputMessage\n : this.#defaultOutputMessage}\n </div>\n </div>\n </fieldset>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderAtprotoTab(html) {\n const did = this.$atproto.value?.did() ?? null;\n const selectedOutput =\n this.$output.value && \"selectedOutput\" in this.$output.value\n ? this.$output.value.selectedOutput()\n : undefined;\n\n const authenticated = () => {\n return html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <span>Signed in as <strong>${did}</strong></span>\n </span>\n </fieldset>\n\n <p class=\"button-row\">\n <button @click=\"${this.#handleAtprotoLogout}\">Sign out</button>\n ${this.#renderAtprotoActivation(html, selectedOutput)}\n </p>\n `;\n };\n\n const unauthenticated = () => {\n return html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <span>\n Store your user data on the storage associated with your AT Protocol\n identity.\n </span>\n </span>\n </fieldset>\n\n <form @submit=\"${this.#handleAtprotoLogin}\">\n <fieldset>\n <div class=\"field-row\">\n <label for=\"atproto-handle\">Your internet handle:</label>\n <input\n id=\"atproto-handle\"\n type=\"text\"\n required\n placeholder=\"you.bsky.social\"\n />\n </div>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"atproto-submit\">Sign in</button>\n ${this.#renderAtprotoActivation(html, selectedOutput)}\n </p>\n </form>\n `;\n };\n\n return html`\n <div class=\"window-body\">\n ${did ? authenticated() : unauthenticated()}\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderS3Tab(html) {\n const s3 = this.$s3.value;\n const ready = s3?.ready() ?? false;\n const selectedOutput =\n this.$output.value && \"selectedOutput\" in this.$output.value\n ? this.$output.value.selectedOutput()\n : undefined;\n\n const configured = () => {\n const bucket = s3?.bucket();\n\n return html`\n <fieldset>\n <div class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <div>\n Bucket configured:\n <ul\n style=\"margin-bottom: 0; padding-left: 0; list-style-position: inside;\"\n >\n <li>Name: <strong>${bucket?.bucketName}</strong></li>\n <li>Host: ${bucket?.host}</li>\n <li>Access key: ${bucket?.accessKey}</li>\n </ul>\n </div>\n </div>\n </fieldset>\n\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/msg_information-0.png\"\n width=\"24\"\n />\n <span>\n Make sure the bucket has CORS configured properly.\n </span>\n </span>\n </fieldset>\n\n <p class=\"button-row\">\n <button id=\"s3-unset-bucket\" @click=\"${this.#handleS3Unset}\">\n Remove bucket configuration\n </button>\n ${this.#renderS3Activation(html, selectedOutput)}\n </p>\n `;\n };\n\n const unconfigured = () => {\n return html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <span>\n Store your user data on an S3-compatible storage service.\n </span>\n </span>\n </fieldset>\n\n <form @submit=\"${this.#handleS3SetBucket}\">\n <fieldset>\n <legend>Bucket details</legend>\n\n <div class=\"field-row\">\n <label for=\"s3-access-key\">Access Key:*</label>\n <input type=\"text\" id=\"s3-access-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-secret-key\">Secret Key:*</label>\n <input type=\"password\" id=\"s3-secret-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-bucket-name\">Bucket Name:*</label>\n <input type=\"text\" id=\"s3-bucket-name\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-host\">Host:</label>\n <input\n type=\"text\"\n id=\"s3-host\"\n placeholder=\"s3.amazonaws.com\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-region\">Region:</label>\n <input\n type=\"text\"\n id=\"s3-region\"\n placeholder=\"us-east-1\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-path\">Path:</label>\n <input type=\"text\" id=\"s3-path\" />\n </div>\n\n <p>\n * are required fields.\n </p>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"s3-submit\">Set bucket</button>\n ${this.#renderS3Activation(html, selectedOutput)}\n </p>\n </form>\n `;\n };\n\n return html`\n <div class=\"window-body\">\n ${ready ? configured() : unconfigured()}\n </div>\n `;\n }\n\n /**\n * @param {RenderArg['html']} html\n * @param {VariousOutputElements | null | undefined} selectedOutput\n */\n #renderAtprotoActivation(html, selectedOutput) {\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return nothing;\n\n const isActive = selectedOutput?.label === \"AT Protocol\";\n\n return isActive\n ? html`\n <button @click=\"${this.#handleDeactivate}\">Deactivate</button>\n `\n : html`\n <button @click=\"${this\n .#handleAtprotoActivate}\">Activate this storage</button>\n `;\n }\n\n /**\n * @param {RenderArg['html']} html\n * @param {VariousOutputElements | null | undefined} selectedOutput\n */\n #renderS3Activation(html, selectedOutput) {\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return nothing;\n\n const isActive = selectedOutput?.label === \"S3\";\n\n return isActive\n ? html`\n <button @click=\"${this.#handleDeactivate}\">Deactivate</button>\n `\n : html`\n <button @click=\"${this\n .#handleS3Activate}\">Activate this storage</button>\n `;\n }\n\n #defaultOutputMessage =\n \"Storing data locally in the browser without any backup or syncing enabled.\";\n}\n\nexport default OutputConfig;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = OutputConfig;\nexport const NAME = \"dtw-output-config\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":["NAME"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-HRFK436L.js.map"}
+157
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-IR27WFXT.js
··· 1 + import { 2 + BroadcastableDiffuseElement, 3 + query, 4 + queryOptional 5 + } from "./chunk-H46AZIKM.js"; 6 + import { 7 + computed, 8 + signal, 9 + untracked 10 + } from "./chunk-IZOBPV2S.js"; 11 + import { 12 + __export, 13 + __name, 14 + init_Buffer, 15 + init_process 16 + } from "./chunk-FZQXS3RE.js"; 17 + 18 + // components/orchestrator/scoped-tracks/element.js 19 + var element_exports = {}; 20 + __export(element_exports, { 21 + CLASS: () => CLASS, 22 + NAME: () => NAME, 23 + default: () => element_default 24 + }); 25 + init_Buffer(); 26 + init_process(); 27 + var ScopedTracksOrchestrator = class extends BroadcastableDiffuseElement { 28 + static { 29 + __name(this, "ScopedTracksOrchestrator"); 30 + } 31 + static NAME = "diffuse/orchestrator/scoped-tracks"; 32 + static WORKER_URL = "components/orchestrator/scoped-tracks/worker.js"; 33 + /** @type {ProxiedActions<Actions>} */ 34 + #proxy; 35 + constructor() { 36 + super(); 37 + this.#proxy = this.workerProxy({ 38 + forceNew: { 39 + dependencies: { 40 + input: true 41 + } 42 + } 43 + }); 44 + } 45 + // SIGNALS 46 + #input = signal( 47 + /** @type {InputElement | null} */ 48 + null 49 + ); 50 + #output = signal( 51 + /** @type {OutputElement | null} */ 52 + null 53 + ); 54 + #scope = signal( 55 + /** @type {import("@components/engine/scope/element.js").CLASS | null} */ 56 + null 57 + ); 58 + #search = signal( 59 + /** @type {import("@components/processor/search/element.js").CLASS | null} */ 60 + null 61 + ); 62 + #selectedPlaylist = computed(() => { 63 + const playlistId = this.#scope.value?.playlistId(); 64 + if (!playlistId) return void 0; 65 + return this.#output.value?.playlists.collection().find( 66 + (p) => p.id === playlistId 67 + ); 68 + }); 69 + #tracksSearch = signal( 70 + /** @type {Track[]} */ 71 + [] 72 + ); 73 + #tracksFinal = signal( 74 + /** @type {Track[]} */ 75 + [] 76 + ); 77 + // STATE 78 + tracks = this.#tracksFinal.get; 79 + // LIFECYCLE 80 + /** 81 + * @override 82 + */ 83 + async connectedCallback() { 84 + if (this.hasAttribute("group")) { 85 + const actions = this.broadcast(this.nameWithGroup, { 86 + setTracksSearch: { 87 + strategy: "replicate", 88 + fn: this.#tracksSearch.set 89 + }, 90 + setTracksFinal: { 91 + strategy: "replicate", 92 + fn: this.#tracksFinal.set 93 + } 94 + }); 95 + if (actions) { 96 + this.#tracksSearch.set = actions.setTracksSearch; 97 + this.#tracksFinal.set = actions.setTracksFinal; 98 + } 99 + } 100 + super.connectedCallback(); 101 + const input = query(this, "input-selector"); 102 + const output = query(this, "output-selector"); 103 + const search = query(this, "search-processor-selector"); 104 + const scope = queryOptional(this, "scope-engine-selector"); 105 + this.#input.value = input; 106 + this.#output.value = output; 107 + this.#search.value = search; 108 + if (scope) this.#scope.value = scope; 109 + await customElements.whenDefined(output.localName); 110 + if (scope) await customElements.whenDefined(scope.localName); 111 + this.effect(async () => { 112 + const collection = output.tracks.collection(); 113 + if (await this.isLeader() === false) return; 114 + this.#proxy.supplyAvailable(collection); 115 + }); 116 + this.effect(async () => { 117 + const _trigger = search.supplyFingerprint(); 118 + const searchTerm = this.#scope.value?.searchTerm(); 119 + if (await this.isLeader() === false) return; 120 + const searchResults = searchTerm ? await this.#proxy.searchTracks({ term: searchTerm }) : untracked(() => output.tracks.collection()); 121 + this.#tracksSearch.set(searchResults); 122 + }); 123 + this.effect(async () => { 124 + const tracks = this.#tracksSearch.value; 125 + const playlist = this.#selectedPlaylist(); 126 + if (await this.isLeader() === false) return; 127 + this.#tracksFinal.set( 128 + playlist ? await this.#proxy.filterByPlaylist({ tracks, playlist }) : tracks 129 + ); 130 + }); 131 + } 132 + // WORKERS 133 + /** 134 + * @override 135 + */ 136 + dependencies() { 137 + if (!this.#input.value) throw new Error("Input element not defined yet"); 138 + if (!this.#search.value) throw new Error("Search element not defined yet"); 139 + return { 140 + input: this.#input.value, 141 + search: this.#search.value 142 + }; 143 + } 144 + }; 145 + var element_default = ScopedTracksOrchestrator; 146 + var CLASS = ScopedTracksOrchestrator; 147 + var NAME = "do-scoped-tracks"; 148 + customElements.define(NAME, CLASS); 149 + 150 + export { 151 + element_default, 152 + CLASS, 153 + NAME, 154 + element_exports 155 + }; 156 + 157 + //# sourceMappingURL=./chunk-IR27WFXT.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-IR27WFXT.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/scoped-tracks/element.js"],"sourcesContent":["import {\n BroadcastableDiffuseElement,\n query,\n queryOptional,\n} from \"@common/element.js\";\nimport { computed, signal, untracked } from \"@common/signal.js\";\n\n/**\n * @import {Playlist, Track} from \"@definitions/types.d.ts\"\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {InputElement} from \"@components/input/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n *\n * @import {Actions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass ScopedTracksOrchestrator extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/orchestrator/scoped-tracks\";\n static WORKER_URL = \"components/orchestrator/scoped-tracks/worker.js\";\n\n /** @type {ProxiedActions<Actions>} */\n #proxy;\n\n constructor() {\n super();\n this.#proxy = this.workerProxy({\n forceNew: {\n dependencies: {\n input: true,\n },\n },\n });\n }\n\n // SIGNALS\n\n #input = signal(/** @type {InputElement | null} */ (null));\n #output = signal(/** @type {OutputElement | null} */ (null));\n\n #scope = signal(\n /** @type {import(\"@components/engine/scope/element.js\").CLASS | null} */ (null),\n );\n\n #search = signal(\n /** @type {import(\"@components/processor/search/element.js\").CLASS | null} */ (null),\n );\n\n #selectedPlaylist = computed(() => {\n const playlistId = this.#scope.value?.playlistId();\n if (!playlistId) return undefined;\n return this.#output.value?.playlists.collection().find((p) =>\n p.id === playlistId\n );\n });\n\n #tracksSearch = signal(/** @type {Track[]} */ ([]));\n #tracksFinal = signal(/** @type {Track[]} */ ([]));\n\n // STATE\n\n tracks = this.#tracksFinal.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n setTracksSearch: {\n strategy: \"replicate\",\n fn: this.#tracksSearch.set,\n },\n setTracksFinal: {\n strategy: \"replicate\",\n fn: this.#tracksFinal.set,\n },\n });\n\n if (actions) {\n this.#tracksSearch.set = actions.setTracksSearch;\n this.#tracksFinal.set = actions.setTracksFinal;\n }\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {InputElement} */\n const input = query(this, \"input-selector\");\n\n /** @type {OutputElement} */\n const output = query(this, \"output-selector\");\n\n /** @type {import(\"@components/processor/search/element.js\").CLASS} */\n const search = query(this, \"search-processor-selector\");\n\n /** @type {import(\"@components/engine/scope/element.js\").CLASS | null} */\n const scope = queryOptional(this, \"scope-engine-selector\");\n\n // Assign to self\n this.#input.value = input;\n this.#output.value = output;\n this.#search.value = search;\n if (scope) this.#scope.value = scope;\n\n // When defined\n await customElements.whenDefined(output.localName);\n if (scope) await customElements.whenDefined(scope.localName);\n\n // Watch tracks collection\n this.effect(async () => {\n const collection = output.tracks.collection();\n if ((await this.isLeader()) === false) return;\n this.#proxy.supplyAvailable(collection);\n });\n\n // Watch search supply\n this.effect(async () => {\n const _trigger = search.supplyFingerprint();\n const searchTerm = this.#scope.value?.searchTerm();\n\n if ((await this.isLeader()) === false) return;\n\n const searchResults = searchTerm\n ? await this.#proxy.searchTracks({ term: searchTerm })\n : untracked(() => output.tracks.collection());\n\n this.#tracksSearch.set(searchResults);\n });\n\n // Watch `#tracksSearch` + Playlist\n this.effect(async () => {\n const tracks = this.#tracksSearch.value;\n const playlist = this.#selectedPlaylist();\n\n if ((await this.isLeader()) === false) return;\n\n this.#tracksFinal.set(\n playlist\n ? await this.#proxy.filterByPlaylist({ tracks, playlist })\n : tracks,\n );\n });\n }\n\n // WORKERS\n\n /**\n * @override\n */\n dependencies() {\n if (!this.#input.value) throw new Error(\"Input element not defined yet\");\n if (!this.#search.value) throw new Error(\"Search element not defined yet\");\n\n return {\n input: this.#input.value,\n search: this.#search.value,\n };\n }\n}\n\nexport default ScopedTracksOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ScopedTracksOrchestrator;\nexport const NAME = \"do-scoped-tracks\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA,IAAM,2BAAN,cAAuC,4BAA4B;AAAA,EApBnE,OAoBmE;AAAA;AAAA;AAAA,EACjE,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA;AAAA,EAGpB;AAAA,EAEA,cAAc;AACZ,UAAM;AACN,SAAK,SAAS,KAAK,YAAY;AAAA,MAC7B,UAAU;AAAA,QACR,cAAc;AAAA,UACZ,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,SAAS;AAAA;AAAA,IAA2C;AAAA,EAAK;AAAA,EACzD,UAAU;AAAA;AAAA,IAA4C;AAAA,EAAK;AAAA,EAE3D,SAAS;AAAA;AAAA,IACoE;AAAA,EAC7E;AAAA,EAEA,UAAU;AAAA;AAAA,IACuE;AAAA,EACjF;AAAA,EAEA,oBAAoB,SAAS,MAAM;AACjC,UAAM,aAAa,KAAK,OAAO,OAAO,WAAW;AACjD,QAAI,CAAC,WAAY,QAAO;AACxB,WAAO,KAAK,QAAQ,OAAO,UAAU,WAAW,EAAE;AAAA,MAAK,CAAC,MACtD,EAAE,OAAO;AAAA,IACX;AAAA,EACF,CAAC;AAAA,EAED,gBAAgB;AAAA;AAAA,IAA+B,CAAC;AAAA,EAAE;AAAA,EAClD,eAAe;AAAA;AAAA,IAA+B,CAAC;AAAA,EAAE;AAAA;AAAA,EAIjD,SAAS,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,MAAM,oBAAoB;AAExB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,YAAM,UAAU,KAAK,UAAU,KAAK,eAAe;AAAA,QACjD,iBAAiB;AAAA,UACf,UAAU;AAAA,UACV,IAAI,KAAK,cAAc;AAAA,QACzB;AAAA,QACA,gBAAgB;AAAA,UACd,UAAU;AAAA,UACV,IAAI,KAAK,aAAa;AAAA,QACxB;AAAA,MACF,CAAC;AAED,UAAI,SAAS;AACX,aAAK,cAAc,MAAM,QAAQ;AACjC,aAAK,aAAa,MAAM,QAAQ;AAAA,MAClC;AAAA,IACF;AAGA,UAAM,kBAAkB;AAGxB,UAAM,QAAQ,MAAM,MAAM,gBAAgB;AAG1C,UAAM,SAAS,MAAM,MAAM,iBAAiB;AAG5C,UAAM,SAAS,MAAM,MAAM,2BAA2B;AAGtD,UAAM,QAAQ,cAAc,MAAM,uBAAuB;AAGzD,SAAK,OAAO,QAAQ;AACpB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,QAAI,MAAO,MAAK,OAAO,QAAQ;AAG/B,UAAM,eAAe,YAAY,OAAO,SAAS;AACjD,QAAI,MAAO,OAAM,eAAe,YAAY,MAAM,SAAS;AAG3D,SAAK,OAAO,YAAY;AACtB,YAAM,aAAa,OAAO,OAAO,WAAW;AAC5C,UAAK,MAAM,KAAK,SAAS,MAAO,MAAO;AACvC,WAAK,OAAO,gBAAgB,UAAU;AAAA,IACxC,CAAC;AAGD,SAAK,OAAO,YAAY;AACtB,YAAM,WAAW,OAAO,kBAAkB;AAC1C,YAAM,aAAa,KAAK,OAAO,OAAO,WAAW;AAEjD,UAAK,MAAM,KAAK,SAAS,MAAO,MAAO;AAEvC,YAAM,gBAAgB,aAClB,MAAM,KAAK,OAAO,aAAa,EAAE,MAAM,WAAW,CAAC,IACnD,UAAU,MAAM,OAAO,OAAO,WAAW,CAAC;AAE9C,WAAK,cAAc,IAAI,aAAa;AAAA,IACtC,CAAC;AAGD,SAAK,OAAO,YAAY;AACtB,YAAM,SAAS,KAAK,cAAc;AAClC,YAAM,WAAW,KAAK,kBAAkB;AAExC,UAAK,MAAM,KAAK,SAAS,MAAO,MAAO;AAEvC,WAAK,aAAa;AAAA,QAChB,WACI,MAAM,KAAK,OAAO,iBAAiB,EAAE,QAAQ,SAAS,CAAC,IACvD;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe;AACb,QAAI,CAAC,KAAK,OAAO,MAAO,OAAM,IAAI,MAAM,+BAA+B;AACvE,QAAI,CAAC,KAAK,QAAQ,MAAO,OAAM,IAAI,MAAM,gCAAgC;AAEzE,WAAO;AAAA,MACL,OAAO,KAAK,OAAO;AAAA,MACnB,QAAQ,KAAK,QAAQ;AAAA,IACvB;AAAA,EACF;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-IR27WFXT.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-IZOBPV2S.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZOBPV2S.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-IZOBPV2S.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZOBPV2S.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-IZZUYQWS.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZZUYQWS.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-IZZUYQWS.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZZUYQWS.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-J34EA5F4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-J34EA5F4.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-J34EA5F4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-J34EA5F4.js.map
+67
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js
··· 1 + import { 2 + __name, 3 + init_Buffer, 4 + init_process 5 + } from "./chunk-FZQXS3RE.js"; 6 + 7 + // ../node_modules/.deno/idb-keyval@6.2.2/node_modules/idb-keyval/dist/index.js 8 + init_Buffer(); 9 + init_process(); 10 + function promisifyRequest(request) { 11 + return new Promise((resolve, reject) => { 12 + request.oncomplete = request.onsuccess = () => resolve(request.result); 13 + request.onabort = request.onerror = () => reject(request.error); 14 + }); 15 + } 16 + __name(promisifyRequest, "promisifyRequest"); 17 + function createStore(dbName, storeName) { 18 + let dbp; 19 + const getDB = /* @__PURE__ */ __name(() => { 20 + if (dbp) 21 + return dbp; 22 + const request = indexedDB.open(dbName); 23 + request.onupgradeneeded = () => request.result.createObjectStore(storeName); 24 + dbp = promisifyRequest(request); 25 + dbp.then((db) => { 26 + db.onclose = () => dbp = void 0; 27 + }, () => { 28 + }); 29 + return dbp; 30 + }, "getDB"); 31 + return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName))); 32 + } 33 + __name(createStore, "createStore"); 34 + var defaultGetStoreFunc; 35 + function defaultGetStore() { 36 + if (!defaultGetStoreFunc) { 37 + defaultGetStoreFunc = createStore("keyval-store", "keyval"); 38 + } 39 + return defaultGetStoreFunc; 40 + } 41 + __name(defaultGetStore, "defaultGetStore"); 42 + function get(key, customStore = defaultGetStore()) { 43 + return customStore("readonly", (store) => promisifyRequest(store.get(key))); 44 + } 45 + __name(get, "get"); 46 + function set(key, value, customStore = defaultGetStore()) { 47 + return customStore("readwrite", (store) => { 48 + store.put(value, key); 49 + return promisifyRequest(store.transaction); 50 + }); 51 + } 52 + __name(set, "set"); 53 + function del(key, customStore = defaultGetStore()) { 54 + return customStore("readwrite", (store) => { 55 + store.delete(key); 56 + return promisifyRequest(store.transaction); 57 + }); 58 + } 59 + __name(del, "del"); 60 + 61 + export { 62 + get, 63 + set, 64 + del 65 + }; 66 + 67 + //# sourceMappingURL=./chunk-JBHW662S.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/idb-keyval@6.2.2/node_modules/idb-keyval/dist/index.js"],"sourcesContent":["function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n let dbp;\n const getDB = () => {\n if (dbp)\n return dbp;\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n dbp = promisifyRequest(request);\n dbp.then((db) => {\n // It seems like Safari sometimes likes to just close the connection.\n // It's supposed to fire this event when that happens. Let's hope it does!\n db.onclose = () => (dbp = undefined);\n }, () => { });\n return dbp;\n };\n return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n"],"mappings":";;;;;;;AAAA;AAAA;AAAA,SAAS,iBAAiB,SAAS;AAC/B,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEpC,YAAQ,aAAa,QAAQ,YAAY,MAAM,QAAQ,QAAQ,MAAM;AAErE,YAAQ,UAAU,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,EAClE,CAAC;AACL;AAPS;AAQT,SAAS,YAAY,QAAQ,WAAW;AACpC,MAAI;AACJ,QAAM,QAAQ,6BAAM;AAChB,QAAI;AACA,aAAO;AACX,UAAM,UAAU,UAAU,KAAK,MAAM;AACrC,YAAQ,kBAAkB,MAAM,QAAQ,OAAO,kBAAkB,SAAS;AAC1E,UAAM,iBAAiB,OAAO;AAC9B,QAAI,KAAK,CAAC,OAAO;AAGb,SAAG,UAAU,MAAO,MAAM;AAAA,IAC9B,GAAG,MAAM;AAAA,IAAE,CAAC;AACZ,WAAO;AAAA,EACX,GAZc;AAad,SAAO,CAAC,QAAQ,aAAa,MAAM,EAAE,KAAK,CAAC,OAAO,SAAS,GAAG,YAAY,WAAW,MAAM,EAAE,YAAY,SAAS,CAAC,CAAC;AACxH;AAhBS;AAiBT,IAAI;AACJ,SAAS,kBAAkB;AACvB,MAAI,CAAC,qBAAqB;AACtB,0BAAsB,YAAY,gBAAgB,QAAQ;AAAA,EAC9D;AACA,SAAO;AACX;AALS;AAYT,SAAS,IAAI,KAAK,cAAc,gBAAgB,GAAG;AAC/C,SAAO,YAAY,YAAY,CAAC,UAAU,iBAAiB,MAAM,IAAI,GAAG,CAAC,CAAC;AAC9E;AAFS;AAUT,SAAS,IAAI,KAAK,OAAO,cAAc,gBAAgB,GAAG;AACtD,SAAO,YAAY,aAAa,CAAC,UAAU;AACvC,UAAM,IAAI,OAAO,GAAG;AACpB,WAAO,iBAAiB,MAAM,WAAW;AAAA,EAC7C,CAAC;AACL;AALS;AA0DT,SAAS,IAAI,KAAK,cAAc,gBAAgB,GAAG;AAC/C,SAAO,YAAY,aAAa,CAAC,UAAU;AACvC,UAAM,OAAO,GAAG;AAChB,WAAO,iBAAiB,MAAM,WAAW;AAAA,EAC7C,CAAC;AACL;AALS;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-JBHW662S.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JSOX7OQB.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-JSOX7OQB.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JSOX7OQB.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-JSOX7OQB.js.map
+608
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JZ7ERCQK.js
··· 1 + import { 2 + e, 3 + i, 4 + p 5 + } from "./chunk-NT5H3ES3.js"; 6 + import { 7 + A, 8 + BroadcastableDiffuseElement 9 + } from "./chunk-H46AZIKM.js"; 10 + import { 11 + computed, 12 + signal, 13 + untracked 14 + } from "./chunk-IZOBPV2S.js"; 15 + import { 16 + __name, 17 + init_Buffer, 18 + init_process 19 + } from "./chunk-FZQXS3RE.js"; 20 + 21 + // components/engine/audio/element.js 22 + init_Buffer(); 23 + init_process(); 24 + 25 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/directives/keyed.js 26 + init_Buffer(); 27 + init_process(); 28 + var i2 = e(class extends i { 29 + constructor() { 30 + super(...arguments), this.key = A; 31 + } 32 + render(r, t) { 33 + return this.key = r, t; 34 + } 35 + update(r, [t, e2]) { 36 + return t !== this.key && (p(r), this.key = t), e2; 37 + } 38 + }); 39 + 40 + // components/engine/audio/element.js 41 + var SILENT_MP3 = "data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjM2LjEwMAAAAAAAAAAAAAAA//OEAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAEAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV6urq6urq6urq6urq6urq6urq6urq6urq6v////////////////////////////////8AAAAATGF2YzU2LjQxAAAAAAAAAAAAAAAAJAAAAAAAAAAAASDs90hvAAAAAAAAAAAAAAAAAAAA//MUZAAAAAGkAAAAAAAAA0gAAAAATEFN//MUZAMAAAGkAAAAAAAAA0gAAAAARTMu//MUZAYAAAGkAAAAAAAAA0gAAAAAOTku//MUZAkAAAGkAAAAAAAAA0gAAAAANVVV"; 42 + var AudioEngine = class extends BroadcastableDiffuseElement { 43 + static { 44 + __name(this, "AudioEngine"); 45 + } 46 + static NAME = "diffuse/engine/audio"; 47 + constructor() { 48 + super(); 49 + this.isPlaying = this.isPlaying.bind(this); 50 + this.state = this.state.bind(this); 51 + } 52 + // SIGNALS 53 + #items = signal( 54 + /** @type {Audio[]} */ 55 + [] 56 + ); 57 + #volume = signal(0.5); 58 + // STATE 59 + items = this.#items.get; 60 + volume = this.#volume.get; 61 + // LIFECYCLE 62 + /** 63 + * @override 64 + */ 65 + connectedCallback() { 66 + if (this.hasAttribute("group")) { 67 + const actions = this.broadcast( 68 + this.nameWithGroup, 69 + { 70 + adjustVolume: { strategy: "replicate", fn: this.adjustVolume }, 71 + pause: { strategy: "leaderOnly", fn: this.pause }, 72 + play: { strategy: "leaderOnly", fn: this.play }, 73 + seek: { strategy: "leaderOnly", fn: this.seek }, 74 + supply: { strategy: "replicate", fn: this.supply }, 75 + // State 76 + items: { strategy: "leaderOnly", fn: this.items } 77 + } 78 + ); 79 + if (!actions) return; 80 + this.adjustVolume = actions.adjustVolume; 81 + this.pause = actions.pause; 82 + this.play = actions.play; 83 + this.seek = actions.seek; 84 + this.supply = actions.supply; 85 + this.broadcastingStatus().then(async (status) => { 86 + if (status.leader) return; 87 + this.#items.value = await actions.items(); 88 + }); 89 + } 90 + super.connectedCallback(); 91 + const VOLUME_KEY = `${this.constructor.prototype.constructor.NAME}/${this.group}/volume`; 92 + const volume = localStorage.getItem(VOLUME_KEY); 93 + if (volume != void 0) { 94 + this.#volume.set(parseFloat(volume)); 95 + } 96 + this.effect(() => { 97 + Array.from(this.querySelectorAll("de-audio-item")).forEach( 98 + (node) => { 99 + const item = ( 100 + /** @type {AudioEngineItem} */ 101 + node 102 + ); 103 + if (item.hasAttribute("preload")) return; 104 + const audio = item.querySelector("audio"); 105 + if (audio) audio.volume = this.#volume.value; 106 + } 107 + ); 108 + localStorage.setItem(VOLUME_KEY, this.#volume.value.toString()); 109 + }); 110 + if (!this.broadcasted) return; 111 + this.effect(async () => { 112 + const status = await this.broadcastingStatus(); 113 + untracked(() => { 114 + if (!(status.leader && status.initialLeader === false)) return; 115 + console.log("\u{1F9D9} Leadership acquired"); 116 + this.items().forEach((item) => { 117 + const el = this.#itemElement(item.id); 118 + if (!el) return; 119 + el.removeAttribute("initial-progress"); 120 + if (!el.audio) return; 121 + const progress = el.$state.progress.value; 122 + const canPlay = /* @__PURE__ */ __name(() => { 123 + this.seek({ 124 + audioId: item.id, 125 + percentage: progress 126 + }); 127 + if (el.$state.isPlaying.value) this.play({ audioId: item.id }); 128 + }, "canPlay"); 129 + el.audio.addEventListener("canplay", canPlay, { once: true }); 130 + if (el.audio.readyState === 0) el.audio.load(); 131 + else canPlay(); 132 + }); 133 + }); 134 + }); 135 + } 136 + // ACTIONS 137 + /** 138 + * @type {Actions["adjustVolume"]} 139 + */ 140 + adjustVolume(args) { 141 + if (args.audioId) { 142 + this.#withAudioNode(args.audioId, (audio) => { 143 + audio.volume = args.volume; 144 + }); 145 + } else { 146 + this.#volume.value = args.volume; 147 + } 148 + } 149 + /** 150 + * @type {Actions["pause"]} 151 + */ 152 + pause({ audioId }) { 153 + this.#withAudioNode(audioId, (audio) => audio.pause()); 154 + } 155 + /** 156 + * @type {Actions["play"]} 157 + */ 158 + play({ audioId, volume }) { 159 + this.#withAudioNode(audioId, (audio, item) => { 160 + audio.volume = volume ?? this.volume(); 161 + audio.muted = false; 162 + if (!audio.isConnected) return; 163 + const promise = audio.play() || Promise.resolve(); 164 + item.$state.isPlaying.set(true); 165 + promise.catch((e2) => { 166 + if (!audio.isConnected) { 167 + return; 168 + } 169 + const err = "Couldn't play audio automatically. Please resume playback manually."; 170 + console.error(err, e2); 171 + item.$state.isPlaying.set(false); 172 + }); 173 + }); 174 + } 175 + /** 176 + * @type {Actions["reload"]} 177 + */ 178 + reload(args) { 179 + this.#withAudioNode(args.audioId, (audio, item) => { 180 + if (audio.readyState === 0 || audio.error?.code === 2) { 181 + audio.load(); 182 + if (args.progress !== void 0) { 183 + item.setAttribute( 184 + "initial-progress", 185 + JSON.stringify(args.progress) 186 + ); 187 + } 188 + if (args.play) { 189 + this.play({ audioId: args.audioId, volume: audio.volume }); 190 + } 191 + } 192 + }); 193 + } 194 + /** 195 + * @type {Actions["seek"]} 196 + */ 197 + seek({ audioId, percentage }) { 198 + this.#withAudioNode(audioId, (audio) => { 199 + if (!isNaN(audio.duration)) { 200 + audio.currentTime = audio.duration * percentage; 201 + } 202 + }); 203 + } 204 + /** 205 + * @type {Actions["supply"]} 206 + */ 207 + supply(args) { 208 + const existingSet = new Set(this.#items.value.map((a) => a.id)); 209 + const newSet = new Set(args.audio.map((a) => a.id)); 210 + if (newSet.difference(existingSet).size !== 0) { 211 + this.#items.value = args.audio; 212 + } 213 + if (args.play) this.play(args.play); 214 + } 215 + // RENDER 216 + /** 217 + * @param {RenderArg} _ 218 + */ 219 + render({ html }) { 220 + const ids = this.items().map((i3) => i3.id); 221 + this.querySelectorAll("de-audio-item").forEach((element) => { 222 + if (ids.includes(element.id)) return; 223 + const source = element.querySelector("source"); 224 + if (source) source.src = SILENT_MP3; 225 + }); 226 + const group = this.group; 227 + const nodes = this.items().map((audio) => { 228 + const ip = audio.progress === void 0 ? "0" : JSON.stringify(audio.progress); 229 + return i2( 230 + audio.id, 231 + html` 232 + <de-audio-item 233 + group="${this.broadcasted ? `${group}/${audio.id}` : A}" 234 + id="${audio.id}" 235 + initial-progress="${ip}" 236 + mime-type="${audio.mimeType ? audio.mimeType : A}" 237 + preload="${audio.isPreload ? `preload` : A}" 238 + url="${audio.url}" 239 + > 240 + <audio 241 + crossorigin="anonymous" 242 + muted="true" 243 + preload="auto" 244 + > 245 + <source 246 + src="${audio.url}" 247 + ${audio.mimeType ? 'type="' + audio.mimeType + '"' : ""} 248 + /> 249 + </audio> 250 + </de-audio-item> 251 + ` 252 + ); 253 + }); 254 + return html` 255 + <section id="audio-nodes"> 256 + ${nodes} 257 + </section> 258 + `; 259 + } 260 + // 🛠️ 261 + /** 262 + * Convenience signal to track if something is, or was, playing. 263 + */ 264 + _isPlaying() { 265 + return computed(() => { 266 + const item = this.items()?.[0]; 267 + if (!item) return false; 268 + const state = this.state(item.id); 269 + if (!state) return false; 270 + return state.isPlaying() || state.hasEnded() || state.progress() === 1; 271 + }); 272 + } 273 + /** 274 + * Get the state of a single audio item. 275 + * 276 + * @param {string} audioId 277 + * @returns {SignalReader<AudioStateReadOnly | undefined>} 278 + */ 279 + _state(audioId) { 280 + return computed(() => { 281 + const _trigger = this.#items.value; 282 + const s = this.#itemElement(audioId)?.state; 283 + return s ? { ...s } : void 0; 284 + }); 285 + } 286 + /** 287 + * Convenience signal to track if something is, or was, playing. 288 + */ 289 + isPlaying() { 290 + return this._isPlaying()(); 291 + } 292 + /** 293 + * Get the state of a single audio item. 294 + * 295 + * @param {string} audioId 296 + * @returns {AudioStateReadOnly | undefined} 297 + */ 298 + state(audioId) { 299 + return this._state(audioId)(); 300 + } 301 + /** 302 + * @param {string} audioId 303 + */ 304 + #itemElement(audioId) { 305 + const node = this.querySelector( 306 + `de-audio-item[id="${audioId}"]:not([preload])` 307 + ); 308 + if (node) { 309 + const item = ( 310 + /** @type {AudioEngineItem} */ 311 + node 312 + ); 313 + return item; 314 + } 315 + } 316 + /** 317 + * @param {string} audioId 318 + * @param {(audio: HTMLAudioElement, item: AudioEngineItem) => void} fn 319 + */ 320 + #withAudioNode(audioId, fn) { 321 + const item = this.#itemElement(audioId); 322 + if (item) fn(item.audio, item); 323 + } 324 + }; 325 + var element_default = AudioEngine; 326 + var AudioEngineItem = class extends BroadcastableDiffuseElement { 327 + static { 328 + __name(this, "AudioEngineItem"); 329 + } 330 + static NAME = "diffuse/engine/audio/item"; 331 + constructor() { 332 + super(); 333 + const ip = this.getAttribute("initial-progress"); 334 + this.$state = { 335 + duration: signal(0), 336 + hasEnded: signal(false), 337 + isPlaying: signal(false), 338 + isPreload: signal(this.hasAttribute("preload")), 339 + loadingState: signal( 340 + /** @type {LoadingState} */ 341 + "loading" 342 + ), 343 + progress: signal(ip ? parseFloat(ip) : 0) 344 + }; 345 + } 346 + // LIFECYCLE 347 + /** 348 + * @override 349 + */ 350 + async connectedCallback() { 351 + const audio = this.audio; 352 + audio.addEventListener("canplay", this.canplayEvent); 353 + audio.addEventListener("durationchange", this.durationchangeEvent); 354 + audio.addEventListener("ended", this.endedEvent); 355 + audio.addEventListener("error", this.errorEvent); 356 + audio.addEventListener("pause", this.pauseEvent); 357 + audio.addEventListener("play", this.playEvent); 358 + audio.addEventListener("suspend", this.suspendEvent); 359 + audio.addEventListener("timeupdate", this.timeupdateEvent); 360 + audio.addEventListener("waiting", this.waitingEvent); 361 + if (this.hasAttribute("group")) { 362 + const actions = this.broadcast( 363 + this.nameWithGroup, 364 + { 365 + getDuration: { strategy: "leaderOnly", fn: this.$state.duration.get }, 366 + getHasEnded: { strategy: "leaderOnly", fn: this.$state.hasEnded.get }, 367 + getIsPlaying: { 368 + strategy: "leaderOnly", 369 + fn: this.$state.isPlaying.get 370 + }, 371 + getIsPreload: { 372 + strategy: "leaderOnly", 373 + fn: this.$state.isPreload.get 374 + }, 375 + getLoadingState: { 376 + strategy: "leaderOnly", 377 + fn: this.$state.loadingState.get 378 + }, 379 + getProgress: { strategy: "leaderOnly", fn: this.$state.progress.get }, 380 + // SET 381 + setDuration: { strategy: "replicate", fn: this.$state.duration.set }, 382 + setHasEnded: { strategy: "replicate", fn: this.$state.hasEnded.set }, 383 + setIsPlaying: { 384 + strategy: "replicate", 385 + fn: this.$state.isPlaying.set 386 + }, 387 + setIsPreload: { 388 + strategy: "replicate", 389 + fn: this.$state.isPreload.set 390 + }, 391 + setLoadingState: { 392 + strategy: "replicate", 393 + fn: this.$state.loadingState.set 394 + }, 395 + setProgress: { strategy: "replicate", fn: this.$state.progress.set } 396 + }, 397 + { 398 + // Sync leadership with engine's broadcasting channel 399 + assumeLeadership: (await this.engine?.broadcastingStatus())?.leader 400 + } 401 + ); 402 + if (actions) { 403 + this.$state.duration.set = actions.setDuration; 404 + this.$state.hasEnded.set = actions.setHasEnded; 405 + this.$state.isPlaying.set = actions.setIsPlaying; 406 + this.$state.isPreload.set = actions.setIsPreload; 407 + this.$state.loadingState.set = actions.setLoadingState; 408 + this.$state.progress.set = actions.setProgress; 409 + untracked(async () => { 410 + this.$state.duration.value = await actions.getDuration(); 411 + this.$state.hasEnded.value = await actions.getHasEnded(); 412 + this.$state.isPlaying.value = await actions.getIsPlaying(); 413 + this.$state.isPreload.value = await actions.getIsPreload(); 414 + this.$state.loadingState.value = await actions.getLoadingState(); 415 + this.$state.progress.value = await actions.getProgress(); 416 + }); 417 + } 418 + } 419 + super.connectedCallback(); 420 + } 421 + // STATE 422 + /** 423 + * @type {AudioStateReadOnly} 424 + */ 425 + get state() { 426 + return { 427 + id: this.id, 428 + mimeType: this.getAttribute("mime-type") ?? void 0, 429 + url: this.getAttribute("url") ?? "", 430 + duration: this.$state.duration.get, 431 + hasEnded: this.$state.hasEnded.get, 432 + isPlaying: this.$state.isPlaying.get, 433 + isPreload: this.$state.isPreload.get, 434 + loadingState: this.$state.loadingState.get, 435 + progress: this.$state.progress.get 436 + }; 437 + } 438 + // RELATED ELEMENTS 439 + get audio() { 440 + const el = this.querySelector("audio"); 441 + if (el) return ( 442 + /** @type {HTMLAudioElement} */ 443 + el 444 + ); 445 + else throw new Error("Cannot find child audio element"); 446 + } 447 + get engine() { 448 + const el = this.closest("de-audio"); 449 + if (el) return ( 450 + /** @type {AudioEngine} */ 451 + el 452 + ); 453 + else return null; 454 + } 455 + // EVENTS 456 + /** 457 + * @param {Event} event 458 + */ 459 + canplayEvent(event) { 460 + const audio = ( 461 + /** @type {HTMLAudioElement} */ 462 + event.target 463 + ); 464 + const item = engineItem(audio); 465 + if (item?.hasAttribute("initial-progress") && audio.duration && !isNaN(audio.duration)) { 466 + const progress = JSON.parse( 467 + item.getAttribute("initial-progress") ?? "0" 468 + ); 469 + audio.currentTime = audio.duration * progress; 470 + item.removeAttribute("initial-progress"); 471 + } 472 + finishedLoading(event); 473 + } 474 + /** 475 + * @param {Event} event 476 + */ 477 + durationchangeEvent(event) { 478 + const audio = ( 479 + /** @type {HTMLAudioElement} */ 480 + event.target 481 + ); 482 + if (!isNaN(audio.duration)) { 483 + engineItem(audio)?.$state.duration.set(audio.duration); 484 + } 485 + } 486 + /** 487 + * @param {Event} event 488 + */ 489 + endedEvent(event) { 490 + const audio = ( 491 + /** @type {HTMLAudioElement} */ 492 + event.target 493 + ); 494 + audio.currentTime = 0; 495 + engineItem(audio)?.$state.hasEnded.set(true); 496 + } 497 + /** 498 + * @param {Event} event 499 + */ 500 + errorEvent(event) { 501 + const audio = ( 502 + /** @type {HTMLAudioElement} */ 503 + event.target 504 + ); 505 + const code = audio.error?.code || 0; 506 + engineItem(audio)?.$state.loadingState.set({ error: { code } }); 507 + } 508 + /** 509 + * @param {Event} event 510 + */ 511 + pauseEvent(event) { 512 + const audio = ( 513 + /** @type {HTMLAudioElement} */ 514 + event.target 515 + ); 516 + const item = engineItem(audio); 517 + item?.$state.isPlaying.set(false); 518 + } 519 + /** 520 + * @param {Event} event 521 + */ 522 + playEvent(event) { 523 + const audio = ( 524 + /** @type {HTMLAudioElement} */ 525 + event.target 526 + ); 527 + const item = engineItem(audio); 528 + item?.$state.hasEnded.set(false); 529 + item?.$state.isPlaying.set(true); 530 + if (audio.readyState === 4) finishedLoading(event); 531 + } 532 + /** 533 + * @param {Event} event 534 + */ 535 + suspendEvent(event) { 536 + finishedLoading(event); 537 + } 538 + /** 539 + * @param {Event} event 540 + */ 541 + timeupdateEvent(event) { 542 + const audio = ( 543 + /** @type {HTMLAudioElement} */ 544 + event.target 545 + ); 546 + if (isNaN(audio.duration) || audio.duration === 0) return; 547 + const progress = audio.currentTime / audio.duration; 548 + if (progress === 0) return; 549 + engineItem(audio)?.$state.progress.set(progress); 550 + } 551 + /** 552 + * @param {Event} event 553 + */ 554 + waitingEvent(event) { 555 + initiateLoading(event); 556 + } 557 + }; 558 + function engineItem(audio) { 559 + const c = audio.closest("de-audio-item"); 560 + if (c) return ( 561 + /** @type {AudioEngineItem} */ 562 + c 563 + ); 564 + else return null; 565 + } 566 + __name(engineItem, "engineItem"); 567 + function finishedLoading(event) { 568 + const audio = ( 569 + /** @type {HTMLAudioElement} */ 570 + event.target 571 + ); 572 + engineItem(audio)?.$state.loadingState.set("loaded"); 573 + } 574 + __name(finishedLoading, "finishedLoading"); 575 + function initiateLoading(event) { 576 + const audio = ( 577 + /** @type {HTMLAudioElement} */ 578 + event.target 579 + ); 580 + if (audio.readyState < 4) { 581 + engineItem(audio)?.$state.loadingState.set("loading"); 582 + } 583 + } 584 + __name(initiateLoading, "initiateLoading"); 585 + var CLASS = AudioEngine; 586 + var NAME = "de-audio"; 587 + var NAME_ITEM = "de-audio-item"; 588 + customElements.define(NAME, AudioEngine); 589 + customElements.define(NAME_ITEM, AudioEngineItem); 590 + 591 + export { 592 + element_default, 593 + AudioEngineItem, 594 + CLASS, 595 + NAME, 596 + NAME_ITEM 597 + }; 598 + /*! Bundled license information: 599 + 600 + lit-html/node/directives/keyed.js: 601 + (** 602 + * @license 603 + * Copyright 2021 Google LLC 604 + * SPDX-License-Identifier: BSD-3-Clause 605 + *) 606 + */ 607 + 608 + //# sourceMappingURL=./chunk-JZ7ERCQK.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JZ7ERCQK.js.map
··· 1 + {"version":3,"sources":["/components/engine/audio/element.js","/node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/src/directives/keyed.ts"],"sourcesContent":["import { keyed } from \"lit-html/directives/keyed.js\";\n\nimport { BroadcastableDiffuseElement, nothing } from \"@common/element.js\";\nimport { computed, signal, untracked } from \"@common/signal.js\";\n\n/**\n * @import {Actions, Audio, AudioState, AudioStateReadOnly, LoadingState} from \"./types.d.ts\"\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {SignalReader} from \"@common/signal.d.ts\"\n */\n\n////////////////////////////////////////////\n// CONSTANTS\n////////////////////////////////////////////\nconst SILENT_MP3 =\n \"data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjM2LjEwMAAAAAAAAAAAAAAA//OEAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAEAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV6urq6urq6urq6urq6urq6urq6urq6urq6v////////////////////////////////8AAAAATGF2YzU2LjQxAAAAAAAAAAAAAAAAJAAAAAAAAAAAASDs90hvAAAAAAAAAAAAAAAAAAAA//MUZAAAAAGkAAAAAAAAA0gAAAAATEFN//MUZAMAAAGkAAAAAAAAA0gAAAAARTMu//MUZAYAAAGkAAAAAAAAA0gAAAAAOTku//MUZAkAAAGkAAAAAAAAA0gAAAAANVVV\";\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {Actions}\n */\nclass AudioEngine extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/engine/audio\";\n\n constructor() {\n super();\n\n this.isPlaying = this.isPlaying.bind(this);\n this.state = this.state.bind(this);\n }\n\n // SIGNALS\n\n #items = signal(/** @type {Audio[]} */ ([]));\n #volume = signal(0.5);\n\n // STATE\n\n items = this.#items.get;\n volume = this.#volume.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n // Setup broadcasting if part of group\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(\n this.nameWithGroup,\n {\n adjustVolume: { strategy: \"replicate\", fn: this.adjustVolume },\n pause: { strategy: \"leaderOnly\", fn: this.pause },\n play: { strategy: \"leaderOnly\", fn: this.play },\n seek: { strategy: \"leaderOnly\", fn: this.seek },\n supply: { strategy: \"replicate\", fn: this.supply },\n\n // State\n items: { strategy: \"leaderOnly\", fn: this.items },\n },\n );\n\n if (!actions) return;\n\n this.adjustVolume = actions.adjustVolume;\n this.pause = actions.pause;\n this.play = actions.play;\n this.seek = actions.seek;\n this.supply = actions.supply;\n\n // Sync items with leader if needed\n this.broadcastingStatus().then(async (status) => {\n if (status.leader) return;\n this.#items.value = await actions.items();\n });\n }\n\n // Super\n super.connectedCallback();\n\n // Get volume from previous session if possible\n const VOLUME_KEY =\n `${this.constructor.prototype.constructor.NAME}/${this.group}/volume`;\n const volume = localStorage.getItem(VOLUME_KEY);\n\n if (volume != undefined) {\n this.#volume.set(parseFloat(volume));\n }\n\n // Monitor volume signal\n this.effect(() => {\n Array.from(this.querySelectorAll(\"de-audio-item\")).forEach(\n (node) => {\n const item = /** @type {AudioEngineItem} */ (node);\n if (item.hasAttribute(\"preload\")) return;\n const audio = item.querySelector(\"audio\");\n if (audio) audio.volume = this.#volume.value;\n },\n );\n\n localStorage.setItem(VOLUME_KEY, this.#volume.value.toString());\n });\n\n // Only broadcasting stuff from here on out\n if (!this.broadcasted) return;\n\n // Manage playback across tabs if needed\n this.effect(async () => {\n const status = await this.broadcastingStatus();\n untracked(() => {\n if (!(status.leader && status.initialLeader === false)) return;\n\n console.log(\"🧙 Leadership acquired\");\n this.items().forEach((item) => {\n const el = this.#itemElement(item.id);\n if (!el) return;\n\n el.removeAttribute(\"initial-progress\");\n\n if (!el.audio) return;\n\n const progress = el.$state.progress.value;\n const canPlay = () => {\n this.seek({\n audioId: item.id,\n percentage: progress,\n });\n\n if (el.$state.isPlaying.value) this.play({ audioId: item.id });\n };\n\n el.audio.addEventListener(\"canplay\", canPlay, { once: true });\n\n if (el.audio.readyState === 0) el.audio.load();\n else canPlay();\n });\n });\n });\n }\n\n // ACTIONS\n\n /**\n * @type {Actions[\"adjustVolume\"]}\n */\n adjustVolume(args) {\n if (args.audioId) {\n this.#withAudioNode(args.audioId, (audio) => {\n audio.volume = args.volume;\n });\n } else {\n this.#volume.value = args.volume;\n }\n }\n\n /**\n * @type {Actions[\"pause\"]}\n */\n pause({ audioId }) {\n this.#withAudioNode(audioId, (audio) => audio.pause());\n }\n\n /**\n * @type {Actions[\"play\"]}\n */\n play({ audioId, volume }) {\n this.#withAudioNode(audioId, (audio, item) => {\n audio.volume = volume ?? this.volume();\n audio.muted = false;\n\n // TODO: Might need this for `data-initial-progress`\n // Does seem to cause trouble when broadcasting\n // (open multiple sessions and play the next audio)\n // if (audio.readyState === 0) audio.load();\n if (!audio.isConnected) return;\n\n const promise = audio.play() || Promise.resolve();\n item.$state.isPlaying.set(true);\n\n promise.catch((e) => {\n if (!audio.isConnected) {\n return; /* The node was removed from the DOM, we can ignore this error */\n }\n const err =\n \"Couldn't play audio automatically. Please resume playback manually.\";\n console.error(err, e);\n item.$state.isPlaying.set(false);\n });\n });\n }\n\n /**\n * @type {Actions[\"reload\"]}\n */\n reload(args) {\n this.#withAudioNode(args.audioId, (audio, item) => {\n if (audio.readyState === 0 || audio.error?.code === 2) {\n audio.load();\n\n if (args.progress !== undefined) {\n item.setAttribute(\n \"initial-progress\",\n JSON.stringify(args.progress),\n );\n }\n\n if (args.play) {\n this.play({ audioId: args.audioId, volume: audio.volume });\n }\n }\n });\n }\n\n /**\n * @type {Actions[\"seek\"]}\n */\n seek({ audioId, percentage }) {\n this.#withAudioNode(audioId, (audio) => {\n if (!isNaN(audio.duration)) {\n audio.currentTime = audio.duration * percentage;\n }\n });\n }\n\n /**\n * @type {Actions[\"supply\"]}\n */\n supply(args) {\n const existingSet = new Set(this.#items.value.map((a) => a.id));\n const newSet = new Set(args.audio.map((a) => a.id));\n\n if (newSet.difference(existingSet).size !== 0) {\n this.#items.value = args.audio;\n }\n\n if (args.play) this.play(args.play);\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n const ids = this.items().map((i) => i.id);\n\n this.querySelectorAll(\"de-audio-item\").forEach((element) => {\n if (ids.includes(element.id)) return;\n\n const source = element.querySelector(\"source\");\n if (source) source.src = SILENT_MP3;\n });\n\n const group = this.group;\n const nodes = this.items().map((audio) => {\n const ip = audio.progress === undefined\n ? \"0\"\n : JSON.stringify(audio.progress);\n\n return keyed(\n audio.id,\n html`\n <de-audio-item\n group=\"${this.broadcasted ? `${group}/${audio.id}` : nothing}\"\n id=\"${audio.id}\"\n initial-progress=\"${ip}\"\n mime-type=\"${audio.mimeType ? audio.mimeType : nothing}\"\n preload=\"${audio.isPreload ? `preload` : nothing}\"\n url=\"${audio.url}\"\n >\n <audio\n crossorigin=\"anonymous\"\n muted=\"true\"\n preload=\"auto\"\n >\n <source\n src=\"${audio.url}\"\n ${audio.mimeType ? 'type=\"' + audio.mimeType + '\"' : \"\"}\n />\n </audio>\n </de-audio-item>\n `,\n );\n });\n\n return html`\n <section id=\"audio-nodes\">\n ${nodes}\n </section>\n `;\n }\n\n // 🛠️\n\n /**\n * Convenience signal to track if something is, or was, playing.\n */\n _isPlaying() {\n return computed(() => {\n const item = this.items()?.[0];\n if (!item) return false;\n\n const state = this.state(item.id);\n if (!state) return false;\n\n return state.isPlaying() || state.hasEnded() || state.progress() === 1;\n });\n }\n\n /**\n * Get the state of a single audio item.\n *\n * @param {string} audioId\n * @returns {SignalReader<AudioStateReadOnly | undefined>}\n */\n _state(audioId) {\n return computed(() => {\n const _trigger = this.#items.value;\n\n const s = this.#itemElement(audioId)?.state;\n return s ? { ...s } : undefined;\n });\n }\n\n /**\n * Convenience signal to track if something is, or was, playing.\n */\n isPlaying() {\n return this._isPlaying()();\n }\n\n /**\n * Get the state of a single audio item.\n *\n * @param {string} audioId\n * @returns {AudioStateReadOnly | undefined}\n */\n state(audioId) {\n return this._state(audioId)();\n }\n\n /**\n * @param {string} audioId\n */\n #itemElement(audioId) {\n const node = this.querySelector(\n `de-audio-item[id=\"${audioId}\"]:not([preload])`,\n );\n\n if (node) {\n const item = /** @type {AudioEngineItem} */ (node);\n return item;\n }\n }\n\n /**\n * @param {string} audioId\n * @param {(audio: HTMLAudioElement, item: AudioEngineItem) => void} fn\n */\n #withAudioNode(audioId, fn) {\n const item = this.#itemElement(audioId);\n if (item) fn(item.audio, item);\n }\n}\n\nexport default AudioEngine;\n\n////////////////////////////////////////////\n// ITEM ELEMENT\n////////////////////////////////////////////\n\nclass AudioEngineItem extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/engine/audio/item\";\n\n constructor() {\n super();\n\n const ip = this.getAttribute(\"initial-progress\");\n\n /**\n * @type {AudioState}\n */\n this.$state = {\n duration: signal(0),\n hasEnded: signal(false),\n isPlaying: signal(false),\n isPreload: signal(this.hasAttribute(\"preload\")),\n loadingState: signal(/** @type {LoadingState} */ (\"loading\")),\n progress: signal(ip ? parseFloat(ip) : 0),\n };\n }\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n const audio = this.audio;\n\n audio.addEventListener(\"canplay\", this.canplayEvent);\n audio.addEventListener(\"durationchange\", this.durationchangeEvent);\n audio.addEventListener(\"ended\", this.endedEvent);\n audio.addEventListener(\"error\", this.errorEvent);\n audio.addEventListener(\"pause\", this.pauseEvent);\n audio.addEventListener(\"play\", this.playEvent);\n audio.addEventListener(\"suspend\", this.suspendEvent);\n audio.addEventListener(\"timeupdate\", this.timeupdateEvent);\n audio.addEventListener(\"waiting\", this.waitingEvent);\n\n // Setup broadcasting if part of group\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(\n this.nameWithGroup,\n {\n getDuration: { strategy: \"leaderOnly\", fn: this.$state.duration.get },\n getHasEnded: { strategy: \"leaderOnly\", fn: this.$state.hasEnded.get },\n getIsPlaying: {\n strategy: \"leaderOnly\",\n fn: this.$state.isPlaying.get,\n },\n getIsPreload: {\n strategy: \"leaderOnly\",\n fn: this.$state.isPreload.get,\n },\n getLoadingState: {\n strategy: \"leaderOnly\",\n fn: this.$state.loadingState.get,\n },\n getProgress: { strategy: \"leaderOnly\", fn: this.$state.progress.get },\n\n // SET\n setDuration: { strategy: \"replicate\", fn: this.$state.duration.set },\n setHasEnded: { strategy: \"replicate\", fn: this.$state.hasEnded.set },\n setIsPlaying: {\n strategy: \"replicate\",\n fn: this.$state.isPlaying.set,\n },\n setIsPreload: {\n strategy: \"replicate\",\n fn: this.$state.isPreload.set,\n },\n setLoadingState: {\n strategy: \"replicate\",\n fn: this.$state.loadingState.set,\n },\n setProgress: { strategy: \"replicate\", fn: this.$state.progress.set },\n },\n {\n // Sync leadership with engine's broadcasting channel\n assumeLeadership: (await this.engine?.broadcastingStatus())?.leader,\n },\n );\n\n if (actions) {\n this.$state.duration.set = actions.setDuration;\n this.$state.hasEnded.set = actions.setHasEnded;\n this.$state.isPlaying.set = actions.setIsPlaying;\n this.$state.isPreload.set = actions.setIsPreload;\n this.$state.loadingState.set = actions.setLoadingState;\n this.$state.progress.set = actions.setProgress;\n\n untracked(async () => {\n this.$state.duration.value = await actions.getDuration();\n this.$state.hasEnded.value = await actions.getHasEnded();\n this.$state.isPlaying.value = await actions.getIsPlaying();\n this.$state.isPreload.value = await actions.getIsPreload();\n this.$state.loadingState.value = await actions.getLoadingState();\n this.$state.progress.value = await actions.getProgress();\n });\n }\n }\n\n // Super\n super.connectedCallback();\n }\n\n // STATE\n\n /**\n * @type {AudioStateReadOnly}\n */\n get state() {\n return {\n id: this.id,\n mimeType: (this.getAttribute(\"mime-type\") ?? undefined),\n url: (this.getAttribute(\"url\") ?? \"\"),\n\n duration: this.$state.duration.get,\n hasEnded: this.$state.hasEnded.get,\n isPlaying: this.$state.isPlaying.get,\n isPreload: this.$state.isPreload.get,\n loadingState: this.$state.loadingState.get,\n progress: this.$state.progress.get,\n };\n }\n\n // RELATED ELEMENTS\n\n get audio() {\n const el = this.querySelector(\"audio\");\n if (el) return /** @type {HTMLAudioElement} */ (el);\n else throw new Error(\"Cannot find child audio element\");\n }\n\n get engine() {\n const el = this.closest(\"de-audio\");\n if (el) return /** @type {AudioEngine} */ (el);\n else return null;\n }\n\n // EVENTS\n\n /**\n * @param {Event} event\n */\n canplayEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n const item = engineItem(audio);\n\n if (\n item?.hasAttribute(\"initial-progress\") &&\n audio.duration &&\n !isNaN(audio.duration)\n ) {\n const progress = JSON.parse(\n item.getAttribute(\"initial-progress\") ?? \"0\",\n );\n audio.currentTime = audio.duration * progress;\n item.removeAttribute(\"initial-progress\");\n }\n\n finishedLoading(event);\n }\n\n /**\n * @param {Event} event\n */\n durationchangeEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n\n if (!isNaN(audio.duration)) {\n engineItem(audio)?.$state.duration.set(audio.duration);\n }\n }\n\n /**\n * @param {Event} event\n */\n endedEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n audio.currentTime = 0;\n\n engineItem(audio)?.$state.hasEnded.set(true);\n }\n\n /**\n * @param {Event} event\n */\n errorEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n const code = audio.error?.code || 0;\n\n engineItem(audio)?.$state.loadingState.set({ error: { code } });\n }\n\n /**\n * @param {Event} event\n */\n pauseEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n const item = engineItem(audio);\n\n item?.$state.isPlaying.set(false);\n }\n\n /**\n * @param {Event} event\n */\n playEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n\n const item = engineItem(audio);\n item?.$state.hasEnded.set(false);\n item?.$state.isPlaying.set(true);\n\n // In case audio was preloaded:\n if (audio.readyState === 4) finishedLoading(event);\n }\n\n /**\n * @param {Event} event\n */\n suspendEvent(event) {\n finishedLoading(event);\n }\n\n /**\n * @param {Event} event\n */\n timeupdateEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n if (isNaN(audio.duration) || audio.duration === 0) return;\n\n const progress = audio.currentTime / audio.duration;\n if (progress === 0) return;\n\n engineItem(audio)?.$state.progress.set(progress);\n }\n\n /**\n * @param {Event} event\n */\n waitingEvent(event) {\n initiateLoading(event);\n }\n}\n\nexport { AudioEngineItem };\n\n////////////////////////////////////////////\n// 🛠️\n////////////////////////////////////////////\n\n/**\n * @param {HTMLAudioElement} audio\n */\nfunction engineItem(audio) {\n const c = audio.closest(\"de-audio-item\");\n if (c) return /** @type {AudioEngineItem} */ (c);\n else return null;\n}\n\n/**\n * @param {Event} event\n */\nfunction finishedLoading(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n engineItem(audio)?.$state.loadingState.set(\"loaded\");\n}\n\n/**\n * @param {Event} event\n */\nfunction initiateLoading(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n if (audio.readyState < 4) {\n engineItem(audio)?.$state.loadingState.set(\"loading\");\n }\n}\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = AudioEngine;\nexport const NAME = \"de-audio\";\nexport const NAME_ITEM = \"de-audio-item\";\n\ncustomElements.define(NAME, AudioEngine);\ncustomElements.define(NAME_ITEM, AudioEngineItem);\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {nothing} from '../lit-html.js';\nimport {\n directive,\n Directive,\n ChildPart,\n DirectiveParameters,\n DirectiveResult,\n} from '../directive.js';\nimport {setCommittedValue} from '../directive-helpers.js';\n\nclass Keyed<T> extends Directive {\n key: unknown = nothing;\n\n render(k: unknown, v: T): T {\n this.key = k;\n return v;\n }\n\n override update(part: ChildPart, [k, v]: DirectiveParameters<this>) {\n if (k !== this.key) {\n // Clear the part before returning a value. The one-arg form of\n // setCommittedValue sets the value to a sentinel which forces a\n // commit the next render.\n setCommittedValue(part);\n this.key = k;\n }\n return v;\n }\n}\n\ninterface KeyedFunc {\n <V>(k: unknown, v: V): DirectiveResult<typeof Keyed<V>>;\n}\n\n/**\n * Associates a renderable value with a unique key. When the key changes, the\n * previous DOM is removed and disposed before rendering the next value, even\n * if the value - such as a template - is the same.\n *\n * This is useful for forcing re-renders of stateful components, or working\n * with code that expects new data to generate new HTML elements, such as some\n * animation techniques.\n */\nexport const keyed: KeyedFunc = directive(Keyed);\n\n/**\n * The type of the class that powers this directive. Necessary for naming the\n * directive's return type.\n */\nexport type {Keyed};\n"],"mappings":"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","names":["keyed","directive","Directive","constructor","this","key","nothing","k","v","part","setCommittedValue","e","i"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-JZ7ERCQK.js.map"}
+56
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-LSHUSEQ5.js
··· 1 + import { 2 + hostsFromTracks 3 + } from "./chunk-SSTS6DW7.js"; 4 + import { 5 + SCHEME 6 + } from "./chunk-HN4F5JEZ.js"; 7 + import { 8 + DiffuseElement 9 + } from "./chunk-H46AZIKM.js"; 10 + import { 11 + __name, 12 + init_Buffer, 13 + init_process 14 + } from "./chunk-FZQXS3RE.js"; 15 + 16 + // components/input/https/element.js 17 + init_Buffer(); 18 + init_process(); 19 + var HttpsInput = class extends DiffuseElement { 20 + static { 21 + __name(this, "HttpsInput"); 22 + } 23 + static NAME = "diffuse/input/https"; 24 + static WORKER_URL = "components/input/https/worker.js"; 25 + SCHEME = SCHEME; 26 + constructor() { 27 + super(); 28 + this.proxy = this.workerProxy(); 29 + this.consult = this.proxy.consult; 30 + this.detach = this.proxy.detach; 31 + this.groupConsult = this.proxy.groupConsult; 32 + this.list = this.proxy.list; 33 + this.resolve = this.proxy.resolve; 34 + } 35 + // 🛠️ 36 + /** @param {Track[]} tracks */ 37 + sources(tracks) { 38 + const hosts = Object.values(hostsFromTracks(tracks)); 39 + return hosts.map((host) => ({ 40 + label: host, 41 + uri: `https://${host}` 42 + })); 43 + } 44 + }; 45 + var element_default = HttpsInput; 46 + var CLASS = HttpsInput; 47 + var NAME = "di-https"; 48 + customElements.define(NAME, CLASS); 49 + 50 + export { 51 + element_default, 52 + CLASS, 53 + NAME 54 + }; 55 + 56 + //# sourceMappingURL=./chunk-LSHUSEQ5.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-LSHUSEQ5.js.map
··· 1 + {"version":3,"sources":["/components/input/https/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { SCHEME } from \"./constants.js\";\nimport { hostsFromTracks } from \"./common.js\";\n\n/**\n * @import {InputActions, InputSchemeProvider} from \"@components/input/types.d.ts\"\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<InputActions>}\n * @implements {InputSchemeProvider}\n */\nclass HttpsInput extends DiffuseElement {\n static NAME = \"diffuse/input/https\";\n static WORKER_URL = \"components/input/https/worker.js\";\n\n SCHEME = SCHEME;\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<InputActions>} */\n this.proxy = this.workerProxy();\n\n this.consult = this.proxy.consult;\n this.detach = this.proxy.detach;\n this.groupConsult = this.proxy.groupConsult;\n this.list = this.proxy.list;\n this.resolve = this.proxy.resolve;\n }\n\n // 🛠️\n\n /** @param {Track[]} tracks */\n sources(tracks) {\n const hosts = Object.values(hostsFromTracks(tracks));\n\n return hosts.map((host) => ({\n label: host,\n uri: `https://${host}`,\n }));\n }\n}\n\nexport default HttpsInput;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = HttpsInput;\nexport const NAME = \"di-https\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;AAkBA,IAAM,aAAN,cAAyB,eAAe;AAAA,EAlBxC,OAkBwC;AAAA;AAAA;AAAA,EACtC,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,SAAS;AAAA,EAET,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,KAAK,YAAY;AAE9B,SAAK,UAAU,KAAK,MAAM;AAC1B,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,eAAe,KAAK,MAAM;AAC/B,SAAK,OAAO,KAAK,MAAM;AACvB,SAAK,UAAU,KAAK,MAAM;AAAA,EAC5B;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAQ;AACd,UAAM,QAAQ,OAAO,OAAO,gBAAgB,MAAM,CAAC;AAEnD,WAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1B,OAAO;AAAA,MACP,KAAK,WAAW,IAAI;AAAA,IACtB,EAAE;AAAA,EACJ;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-LSHUSEQ5.js.map"}
+37
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-M4NQYVPY.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + __name, 6 + init_Buffer, 7 + init_process 8 + } from "./chunk-FZQXS3RE.js"; 9 + 10 + // components/processor/artwork/element.js 11 + init_Buffer(); 12 + init_process(); 13 + var ArtworkProcessor = class extends DiffuseElement { 14 + static { 15 + __name(this, "ArtworkProcessor"); 16 + } 17 + static NAME = "diffuse/processor/artwork"; 18 + static WORKER_URL = "components/processor/artwork/worker.js"; 19 + constructor() { 20 + super(); 21 + const p = this.workerProxy(); 22 + this.artwork = p.artwork; 23 + this.supply = p.supply; 24 + } 25 + }; 26 + var element_default = ArtworkProcessor; 27 + var CLASS = ArtworkProcessor; 28 + var NAME = "dp-artwork"; 29 + customElements.define(NAME, ArtworkProcessor); 30 + 31 + export { 32 + element_default, 33 + CLASS, 34 + NAME 35 + }; 36 + 37 + //# sourceMappingURL=./chunk-M4NQYVPY.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-M4NQYVPY.js.map
··· 1 + {"version":3,"sources":["/components/processor/artwork/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\n\n/**\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {Actions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<Actions>}\n */\nclass ArtworkProcessor extends DiffuseElement {\n static NAME = \"diffuse/processor/artwork\";\n static WORKER_URL = \"components/processor/artwork/worker.js\";\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<Actions>} */\n const p = this.workerProxy();\n\n this.artwork = p.artwork;\n this.supply = p.supply;\n }\n}\n\nexport default ArtworkProcessor;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ArtworkProcessor;\nexport const NAME = \"dp-artwork\";\n\ncustomElements.define(NAME, ArtworkProcessor);\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAcA,IAAM,mBAAN,cAA+B,eAAe;AAAA,EAd9C,OAc8C;AAAA;AAAA;AAAA,EAC5C,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,cAAc;AACZ,UAAM;AAGN,UAAM,IAAI,KAAK,YAAY;AAE3B,SAAK,UAAU,EAAE;AACjB,SAAK,SAAS,EAAE;AAAA,EAClB;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,gBAAgB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-M4NQYVPY.js.map"}
+78
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-MA2JKS5M.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + __name, 6 + init_Buffer, 7 + init_process 8 + } from "./chunk-FZQXS3RE.js"; 9 + 10 + // components/orchestrator/input/element.js 11 + init_Buffer(); 12 + init_process(); 13 + var InputOrchestrator = class extends DiffuseElement { 14 + static { 15 + __name(this, "InputOrchestrator"); 16 + } 17 + static NAME = "diffuse/orchestrator/input"; 18 + static WORKER_URL = "components/configurator/input/worker.js"; 19 + /** 20 + * @returns {InputElement} 21 + */ 22 + get input() { 23 + const input = this.querySelector("dc-input"); 24 + if (!input) throw new Error("Input orchestrator did not render yet."); 25 + return input; 26 + } 27 + // PROXY INPUT ACTIONS 28 + consult = ( 29 + /** @type {InputActions["consult"]} */ 30 + /* @__PURE__ */ __name((...args) => this.input.consult(...args), "consult") 31 + ); 32 + detach = ( 33 + /** @type {InputActions["detach"]} */ 34 + /* @__PURE__ */ __name((...args) => this.input.detach(...args), "detach") 35 + ); 36 + groupConsult = ( 37 + /** @type {InputActions["groupConsult"]} */ 38 + /* @__PURE__ */ __name((...args) => this.input.groupConsult(...args), "groupConsult") 39 + ); 40 + list = ( 41 + /** @type {InputActions["list"]} */ 42 + /* @__PURE__ */ __name((...args) => this.input.list(...args), "list") 43 + ); 44 + resolve = ( 45 + /** @type {InputActions["resolve"]} */ 46 + /* @__PURE__ */ __name((...args) => this.input.resolve(...args), "resolve") 47 + ); 48 + // PROXY OTHER FUNCTIONS 49 + /** @override */ 50 + dependencies() { 51 + return this.input.dependencies(); 52 + } 53 + // RENDER 54 + /** 55 + * @param {RenderArg} _ 56 + */ 57 + render({ html }) { 58 + return html` 59 + <dc-input> 60 + <di-https></di-https> 61 + <di-opensubsonic></di-opensubsonic> 62 + <di-s3></di-s3> 63 + </dc-input> 64 + `; 65 + } 66 + }; 67 + var element_default = InputOrchestrator; 68 + var CLASS = InputOrchestrator; 69 + var NAME = "do-input"; 70 + customElements.define(NAME, CLASS); 71 + 72 + export { 73 + element_default, 74 + CLASS, 75 + NAME 76 + }; 77 + 78 + //# sourceMappingURL=./chunk-MA2JKS5M.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-MA2JKS5M.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/input/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\n\nimport \"@components/configurator/input/element.js\";\nimport \"@components/input/https/element.js\";\nimport \"@components/input/opensubsonic/element.js\";\nimport \"@components/input/s3/element.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {InputActions, InputElement} from \"@components/input/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass InputOrchestrator extends DiffuseElement {\n static NAME = \"diffuse/orchestrator/input\";\n static WORKER_URL = \"components/configurator/input/worker.js\";\n\n /**\n * @returns {InputElement}\n */\n get input() {\n /** @type {InputElement | null} */\n const input = this.querySelector(\"dc-input\");\n\n if (!input) throw new Error(\"Input orchestrator did not render yet.\");\n return input;\n }\n\n // PROXY INPUT ACTIONS\n\n consult = /** @type {InputActions[\"consult\"]} */ (...args) =>\n this.input.consult(...args);\n\n detach = /** @type {InputActions[\"detach\"]} */ (...args) =>\n this.input.detach(...args);\n\n groupConsult = /** @type {InputActions[\"groupConsult\"]} */ (...args) =>\n this.input.groupConsult(...args);\n\n list = /** @type {InputActions[\"list\"]} */ (...args) =>\n this.input.list(...args);\n\n resolve = /** @type {InputActions[\"resolve\"]} */ (...args) =>\n this.input.resolve(...args);\n\n // PROXY OTHER FUNCTIONS\n\n /** @override */\n dependencies() {\n return this.input.dependencies();\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <dc-input>\n <di-https></di-https>\n <di-opensubsonic></di-opensubsonic>\n <di-s3></di-s3>\n </dc-input>\n `;\n }\n}\n\nexport default InputOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = InputOrchestrator;\nexport const NAME = \"do-input\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAgBA,IAAM,oBAAN,cAAgC,eAAe;AAAA,EAhB/C,OAgB+C;AAAA;AAAA;AAAA,EAC7C,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA;AAAA;AAAA;AAAA,EAKpB,IAAI,QAAQ;AAEV,UAAM,QAAQ,KAAK,cAAc,UAAU;AAE3C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wCAAwC;AACpE,WAAO;AAAA,EACT;AAAA;AAAA,EAIA;AAAA;AAAA,IAAiD,2BAAI,SACnD,KAAK,MAAM,QAAQ,GAAG,IAAI,GADqB;AAAA;AAAA,EAGjD;AAAA;AAAA,IAA+C,2BAAI,SACjD,KAAK,MAAM,OAAO,GAAG,IAAI,GADoB;AAAA;AAAA,EAG/C;AAAA;AAAA,IAA2D,2BAAI,SAC7D,KAAK,MAAM,aAAa,GAAG,IAAI,GAD0B;AAAA;AAAA,EAG3D;AAAA;AAAA,IAA2C,2BAAI,SAC7C,KAAK,MAAM,KAAK,GAAG,IAAI,GADkB;AAAA;AAAA,EAG3C;AAAA;AAAA,IAAiD,2BAAI,SACnD,KAAK,MAAM,QAAQ,GAAG,IAAI,GADqB;AAAA;AAAA;AAAA;AAAA,EAMjD,eAAe;AACb,WAAO,KAAK,MAAM,aAAa;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,EAAE,KAAK,GAAG;AACf,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-MA2JKS5M.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-MZP4RURX.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-MZP4RURX.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-MZP4RURX.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-MZP4RURX.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-NCFHYTLD.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-NCFHYTLD.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-NCFHYTLD.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-NCFHYTLD.js.map
+166
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-NMCS5TQK.js
··· 1 + import { 2 + outputManager 3 + } from "./chunk-5UTOUDDD.js"; 4 + import { 5 + del, 6 + get, 7 + set 8 + } from "./chunk-JBHW662S.js"; 9 + import { 10 + BroadcastableDiffuseElement 11 + } from "./chunk-H46AZIKM.js"; 12 + import { 13 + computed, 14 + signal 15 + } from "./chunk-IZOBPV2S.js"; 16 + import { 17 + __name, 18 + init_Buffer, 19 + init_process 20 + } from "./chunk-FZQXS3RE.js"; 21 + 22 + // components/output/bytes/s3/element.js 23 + init_Buffer(); 24 + init_process(); 25 + var STORAGE_PREFIX = "diffuse/output/bytes/s3"; 26 + var S3Output = class extends BroadcastableDiffuseElement { 27 + static { 28 + __name(this, "S3Output"); 29 + } 30 + static NAME = "diffuse/output/bytes/s3"; 31 + static WORKER_URL = "components/output/bytes/s3/worker.js"; 32 + #manager; 33 + constructor() { 34 + super(); 35 + this.proxy = this.workerProxy(); 36 + this.#manager = outputManager({ 37 + facets: { 38 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 39 + get: /* @__PURE__ */ __name(() => this.#get("facets"), "get"), 40 + put: /* @__PURE__ */ __name((data) => this.#put("facets", data), "put") 41 + }, 42 + init: /* @__PURE__ */ __name(() => this.whenConnected(), "init"), 43 + playlists: { 44 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 45 + get: /* @__PURE__ */ __name(() => this.#get("playlists"), "get"), 46 + put: /* @__PURE__ */ __name((data) => this.#put("playlists", data), "put") 47 + }, 48 + themes: { 49 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 50 + get: /* @__PURE__ */ __name(() => this.#get("themes"), "get"), 51 + put: /* @__PURE__ */ __name((data) => this.#put("themes", data), "put") 52 + }, 53 + tracks: { 54 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 55 + get: /* @__PURE__ */ __name(() => this.#get("tracks"), "get"), 56 + put: /* @__PURE__ */ __name((data) => this.#put("tracks", data), "put") 57 + } 58 + }); 59 + this.facets = this.#manager.facets; 60 + this.playlists = this.#manager.playlists; 61 + this.themes = this.#manager.themes; 62 + this.tracks = this.#manager.tracks; 63 + } 64 + // STATE 65 + ready = computed(() => { 66 + return this.#bucket.value !== void 0; 67 + }); 68 + // LIFECYCLE 69 + /** 70 + * @override 71 + */ 72 + async connectedCallback() { 73 + if (this.hasAttribute("group")) { 74 + const actions = this.broadcast(this.nameWithGroup, { 75 + put: { strategy: "replicate", fn: this.#putIncoming } 76 + }); 77 + if (actions) { 78 + this.#put = this.#putOutgoing(actions.put); 79 + } 80 + } 81 + super.connectedCallback(); 82 + const stored = await get(`${STORAGE_PREFIX}/bucket`); 83 + if (stored) this.#bucket.value = stored; 84 + } 85 + // BUCKET 86 + #bucket = signal( 87 + /** @type {Bucket | undefined} */ 88 + void 0 89 + ); 90 + bucket = this.#bucket.get; 91 + /** @returns {Promise<Bucket | undefined>} */ 92 + async getBucket() { 93 + if (!this.#bucket.value) { 94 + const stored = await get(`${STORAGE_PREFIX}/bucket`); 95 + if (stored) this.#bucket.value = stored; 96 + return stored; 97 + } 98 + return this.#bucket.value; 99 + } 100 + /** 101 + * @param {Bucket} bucket 102 + */ 103 + async setBucket(bucket) { 104 + this.#bucket.value = bucket; 105 + await set(`${STORAGE_PREFIX}/bucket`, bucket); 106 + } 107 + async unsetBucket() { 108 + this.#bucket.value = void 0; 109 + await del(`${STORAGE_PREFIX}/bucket`); 110 + } 111 + // GET & PUT 112 + /** @param {string} name */ 113 + #getProxy = /* @__PURE__ */ __name(async (name) => { 114 + const bucket = await this.getBucket(); 115 + if (!bucket) return void 0; 116 + return this.proxy.get({ bucket, name: this.#cat(name) }); 117 + }, "#getProxy"); 118 + #get = this.#getProxy; 119 + /** @param {string} name; @param {any} data */ 120 + #putProxy = /* @__PURE__ */ __name(async (name, data) => { 121 + const bucket = await this.getBucket(); 122 + if (!bucket) return void 0; 123 + return this.proxy.put({ bucket, data, name: this.#cat(name) }); 124 + }, "#putProxy"); 125 + #put = this.#putProxy; 126 + /** 127 + * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, name: string, data: any) => Promise<void>} action 128 + * @returns {(name: string, data: any) => Promise<void>} 129 + */ 130 + #putOutgoing = /* @__PURE__ */ __name((action) => async (name, data) => { 131 + return await action(this.uuid, name, data); 132 + }, "#putOutgoing"); 133 + /** 134 + * @param {ReturnType<typeof crypto.randomUUID>} uuidSender 135 + * @param {string} name 136 + * @param {any} data 137 + */ 138 + #putIncoming(uuidSender, name, data) { 139 + if (uuidSender === this.uuid) { 140 + this.#putProxy(name, data); 141 + } else { 142 + if (name === "facets") this.#manager.signals.facets.value = data; 143 + if (name === "playlists") this.#manager.signals.playlists.value = data; 144 + if (name === "themes") this.#manager.signals.themes.value = data; 145 + if (name === "tracks") this.#manager.signals.tracks.value = data; 146 + } 147 + } 148 + // 🛠️ 149 + /** @param {string} name */ 150 + #cat(name) { 151 + const namespace = this.hasAttribute("namespace") ? this.getAttribute("namespace") + "/" : ""; 152 + return `${namespace}${name}`; 153 + } 154 + }; 155 + var element_default = S3Output; 156 + var CLASS = S3Output; 157 + var NAME = "dob-s3"; 158 + customElements.define(NAME, S3Output); 159 + 160 + export { 161 + element_default, 162 + CLASS, 163 + NAME 164 + }; 165 + 166 + //# sourceMappingURL=./chunk-NMCS5TQK.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-NMCS5TQK.js.map
··· 1 + {"version":3,"sources":["/components/output/bytes/s3/element.js"],"sourcesContent":["import * as IDB from \"idb-keyval\";\n\nimport { BroadcastableDiffuseElement } from \"@common/element.js\";\nimport { computed, signal } from \"@common/signal.js\";\nimport { outputManager } from \"../../common.js\";\n\nconst STORAGE_PREFIX = \"diffuse/output/bytes/s3\";\n\n/**\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {OutputElement, OutputManager} from \"../../types.d.ts\"\n * @import {Bucket} from \"@components/input/s3/types.d.ts\"\n * @import {S3OutputElement, S3OutputWorkerActions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {OutputElement<Uint8Array | undefined>}\n * @implements {S3OutputElement}\n */\nclass S3Output extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/output/bytes/s3\";\n static WORKER_URL = \"components/output/bytes/s3/worker.js\";\n\n #manager;\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<S3OutputWorkerActions>} */\n this.proxy = this.workerProxy();\n\n /** @type {OutputManager<Uint8Array | undefined>} */\n this.#manager = outputManager({\n facets: {\n empty: () => undefined,\n get: () => this.#get(\"facets\"),\n put: (data) => this.#put(\"facets\", data),\n },\n init: () => this.whenConnected(),\n playlists: {\n empty: () => undefined,\n get: () => this.#get(\"playlists\"),\n put: (data) => this.#put(\"playlists\", data),\n },\n themes: {\n empty: () => undefined,\n get: () => this.#get(\"themes\"),\n put: (data) => this.#put(\"themes\", data),\n },\n tracks: {\n empty: () => undefined,\n get: () => this.#get(\"tracks\"),\n put: (data) => this.#put(\"tracks\", data),\n },\n });\n\n this.facets = this.#manager.facets;\n this.playlists = this.#manager.playlists;\n this.themes = this.#manager.themes;\n this.tracks = this.#manager.tracks;\n }\n\n // STATE\n\n ready = computed(() => {\n return this.#bucket.value !== undefined;\n });\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n // TODO: Get via leader?\n const actions = this.broadcast(this.nameWithGroup, {\n put: { strategy: \"replicate\", fn: this.#putIncoming },\n });\n\n if (actions) {\n this.#put = this.#putOutgoing(actions.put);\n }\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {Bucket | undefined} */\n const stored = await IDB.get(`${STORAGE_PREFIX}/bucket`);\n if (stored) this.#bucket.value = stored;\n }\n\n // BUCKET\n\n #bucket = signal(/** @type {Bucket | undefined} */ (undefined));\n\n bucket = this.#bucket.get;\n\n /** @returns {Promise<Bucket | undefined>} */\n async getBucket() {\n if (!this.#bucket.value) {\n /** @type {Bucket | undefined} */\n const stored = await IDB.get(`${STORAGE_PREFIX}/bucket`);\n if (stored) this.#bucket.value = stored;\n return stored;\n }\n\n return this.#bucket.value;\n }\n\n /**\n * @param {Bucket} bucket\n */\n async setBucket(bucket) {\n this.#bucket.value = bucket;\n await IDB.set(`${STORAGE_PREFIX}/bucket`, bucket);\n }\n\n async unsetBucket() {\n this.#bucket.value = undefined;\n await IDB.del(`${STORAGE_PREFIX}/bucket`);\n }\n\n // GET & PUT\n\n /** @param {string} name */\n #getProxy = async (name) => {\n const bucket = await this.getBucket();\n if (!bucket) return undefined;\n return this.proxy.get({ bucket, name: this.#cat(name) });\n };\n\n #get = this.#getProxy;\n\n /** @param {string} name; @param {any} data */\n #putProxy = async (name, data) => {\n const bucket = await this.getBucket();\n if (!bucket) return undefined;\n return this.proxy.put({ bucket, data, name: this.#cat(name) });\n };\n\n #put = this.#putProxy;\n\n /**\n * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, name: string, data: any) => Promise<void>} action\n * @returns {(name: string, data: any) => Promise<void>}\n */\n #putOutgoing = (action) => async (name, data) => {\n return await action(this.uuid, name, data);\n };\n\n /**\n * @param {ReturnType<typeof crypto.randomUUID>} uuidSender\n * @param {string} name\n * @param {any} data\n */\n #putIncoming(uuidSender, name, data) {\n if (uuidSender === this.uuid) {\n // Initiator\n this.#putProxy(name, data);\n } else {\n // Listener\n if (name === \"facets\") this.#manager.signals.facets.value = data;\n if (name === \"playlists\") this.#manager.signals.playlists.value = data;\n if (name === \"themes\") this.#manager.signals.themes.value = data;\n if (name === \"tracks\") this.#manager.signals.tracks.value = data;\n }\n }\n\n // 🛠️\n\n /** @param {string} name */\n #cat(name) {\n const namespace = this.hasAttribute(\"namespace\")\n ? this.getAttribute(\"namespace\") + \"/\"\n : \"\";\n return `${namespace}${name}`;\n }\n}\n\nexport default S3Output;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = S3Output;\nexport const NAME = \"dob-s3\";\n\ncustomElements.define(NAME, S3Output);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-NMCS5TQK.js.map"}
+97
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-NT5H3ES3.js
··· 1 + import { 2 + Z 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + __name, 6 + init_Buffer, 7 + init_process 8 + } from "./chunk-FZQXS3RE.js"; 9 + 10 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/directive.js 11 + init_Buffer(); 12 + init_process(); 13 + var e = /* @__PURE__ */ __name((t2) => (...e2) => ({ _$litDirective$: t2, values: e2 }), "e"); 14 + var i = class { 15 + static { 16 + __name(this, "i"); 17 + } 18 + constructor(t2) { 19 + } 20 + get _$AU() { 21 + return this._$AM._$AU; 22 + } 23 + _$AT(t2, e2, i3) { 24 + this._$Ct = t2, this._$AM = e2, this._$Ci = i3; 25 + } 26 + _$AS(t2, e2) { 27 + return this.update(t2, e2); 28 + } 29 + update(t2, e2) { 30 + return this.render(...e2); 31 + } 32 + }; 33 + 34 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/directive-helpers.js 35 + init_Buffer(); 36 + init_process(); 37 + var { I: t } = Z; 38 + var i2 = /* @__PURE__ */ __name((o) => o, "i"); 39 + var l = /* @__PURE__ */ __name((o, t2) => void 0 === t2 ? void 0 !== o?._$litType$ : o?._$litType$ === t2, "l"); 40 + var d = /* @__PURE__ */ __name((o) => null != o?._$litType$?.h, "d"); 41 + var s = /* @__PURE__ */ __name(() => document.createComment(""), "s"); 42 + var v = /* @__PURE__ */ __name((o, n, e2) => { 43 + const l2 = o._$AA.parentNode, d2 = void 0 === n ? o._$AB : n._$AA; 44 + if (void 0 === e2) { 45 + const i3 = l2.insertBefore(s(), d2), n2 = l2.insertBefore(s(), d2); 46 + e2 = new t(i3, n2, o, o.options); 47 + } else { 48 + const t2 = e2._$AB.nextSibling, n2 = e2._$AM, c = n2 !== o; 49 + if (c) { 50 + let t3; 51 + e2._$AQ?.(o), e2._$AM = o, void 0 !== e2._$AP && (t3 = o._$AU) !== n2._$AU && e2._$AP(t3); 52 + } 53 + if (t2 !== d2 || c) { 54 + let o2 = e2._$AA; 55 + for (; o2 !== t2; ) { 56 + const t3 = i2(o2).nextSibling; 57 + i2(l2).insertBefore(o2, d2), o2 = t3; 58 + } 59 + } 60 + } 61 + return e2; 62 + }, "v"); 63 + var m = {}; 64 + var p = /* @__PURE__ */ __name((o, t2 = m) => o._$AH = t2, "p"); 65 + var M = /* @__PURE__ */ __name((o) => o._$AH, "M"); 66 + var j = /* @__PURE__ */ __name((o) => { 67 + o._$AR(); 68 + }, "j"); 69 + 70 + export { 71 + e, 72 + i, 73 + l, 74 + d, 75 + v, 76 + p, 77 + M, 78 + j 79 + }; 80 + /*! Bundled license information: 81 + 82 + lit-html/node/directive.js: 83 + (** 84 + * @license 85 + * Copyright 2017 Google LLC 86 + * SPDX-License-Identifier: BSD-3-Clause 87 + *) 88 + 89 + lit-html/node/directive-helpers.js: 90 + (** 91 + * @license 92 + * Copyright 2020 Google LLC 93 + * SPDX-License-Identifier: BSD-3-Clause 94 + *) 95 + */ 96 + 97 + //# sourceMappingURL=./chunk-NT5H3ES3.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-NT5H3ES3.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/src/directive.ts","/node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/src/directive-helpers.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {Disconnectable, Part} from './lit-html.js';\n\nexport {\n AttributePart,\n BooleanAttributePart,\n ChildPart,\n ElementPart,\n EventPart,\n Part,\n PropertyPart,\n} from './lit-html.js';\n\nexport interface DirectiveClass {\n new (part: PartInfo): Directive;\n}\n\n/**\n * This utility type extracts the signature of a directive class's render()\n * method so we can use it for the type of the generated directive function.\n */\nexport type DirectiveParameters<C extends Directive> = Parameters<C['render']>;\n\n/**\n * A generated directive function doesn't evaluate the directive, but just\n * returns a DirectiveResult object that captures the arguments.\n */\nexport interface DirectiveResult<C extends DirectiveClass = DirectiveClass> {\n /**\n * This property needs to remain unminified.\n * @internal\n */\n ['_$litDirective$']: C;\n /** @internal */\n values: DirectiveParameters<InstanceType<C>>;\n}\n\nexport const PartType = {\n ATTRIBUTE: 1,\n CHILD: 2,\n PROPERTY: 3,\n BOOLEAN_ATTRIBUTE: 4,\n EVENT: 5,\n ELEMENT: 6,\n} as const;\n\nexport type PartType = (typeof PartType)[keyof typeof PartType];\n\nexport interface ChildPartInfo {\n readonly type: typeof PartType.CHILD;\n}\n\nexport interface AttributePartInfo {\n readonly type:\n | typeof PartType.ATTRIBUTE\n | typeof PartType.PROPERTY\n | typeof PartType.BOOLEAN_ATTRIBUTE\n | typeof PartType.EVENT;\n readonly strings?: ReadonlyArray<string>;\n readonly name: string;\n readonly tagName: string;\n}\n\nexport interface ElementPartInfo {\n readonly type: typeof PartType.ELEMENT;\n}\n\n/**\n * Information about the part a directive is bound to.\n *\n * This is useful for checking that a directive is attached to a valid part,\n * such as with directive that can only be used on attribute bindings.\n */\nexport type PartInfo = ChildPartInfo | AttributePartInfo | ElementPartInfo;\n\n/**\n * Creates a user-facing directive function from a Directive class. This\n * function has the same parameters as the directive's render() method.\n */\nexport const directive =\n <C extends DirectiveClass>(c: C) =>\n (...values: DirectiveParameters<InstanceType<C>>): DirectiveResult<C> => ({\n // This property needs to remain unminified.\n ['_$litDirective$']: c,\n values,\n });\n\n/**\n * Base class for creating custom directives. Users should extend this class,\n * implement `render` and/or `update`, and then pass their subclass to\n * `directive`.\n */\nexport abstract class Directive implements Disconnectable {\n //@internal\n __part!: Part;\n //@internal\n __attributeIndex: number | undefined;\n //@internal\n __directive?: Directive;\n\n //@internal\n _$parent!: Disconnectable;\n\n // These will only exist on the AsyncDirective subclass\n //@internal\n _$disconnectableChildren?: Set<Disconnectable>;\n // This property needs to remain unminified.\n //@internal\n ['_$notifyDirectiveConnectionChanged']?(isConnected: boolean): void;\n\n constructor(_partInfo: PartInfo) {}\n\n // See comment in Disconnectable interface for why this is a getter\n get _$isConnected() {\n return this._$parent._$isConnected;\n }\n\n /** @internal */\n _$initialize(\n part: Part,\n parent: Disconnectable,\n attributeIndex: number | undefined\n ) {\n this.__part = part;\n this._$parent = parent;\n this.__attributeIndex = attributeIndex;\n }\n /** @internal */\n _$resolve(part: Part, props: Array<unknown>): unknown {\n return this.update(part, props);\n }\n\n abstract render(...props: Array<unknown>): unknown;\n\n update(_part: Part, props: Array<unknown>): unknown {\n return this.render(...props);\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {\n _$LH,\n Part,\n DirectiveParent,\n CompiledTemplateResult,\n MaybeCompiledTemplateResult,\n UncompiledTemplateResult,\n} from './lit-html.js';\nimport {\n DirectiveResult,\n DirectiveClass,\n PartInfo,\n AttributePartInfo,\n} from './directive.js';\ntype Primitive = null | undefined | boolean | number | string | symbol | bigint;\n\nconst {_ChildPart: ChildPart} = _$LH;\n\ntype ChildPart = InstanceType<typeof ChildPart>;\n\nconst ENABLE_SHADYDOM_NOPATCH = true;\n\nconst wrap =\n ENABLE_SHADYDOM_NOPATCH &&\n window.ShadyDOM?.inUse &&\n window.ShadyDOM?.noPatch === true\n ? window.ShadyDOM!.wrap\n : (node: Node) => node;\n\n/**\n * Tests if a value is a primitive value.\n *\n * See https://tc39.github.io/ecma262/#sec-typeof-operator\n */\nexport const isPrimitive = (value: unknown): value is Primitive =>\n value === null || (typeof value != 'object' && typeof value != 'function');\n\nexport const TemplateResultType = {\n HTML: 1,\n SVG: 2,\n MATHML: 3,\n} as const;\n\nexport type TemplateResultType =\n (typeof TemplateResultType)[keyof typeof TemplateResultType];\n\ntype IsTemplateResult = {\n (val: unknown): val is MaybeCompiledTemplateResult;\n <T extends TemplateResultType>(\n val: unknown,\n type: T\n ): val is UncompiledTemplateResult<T>;\n};\n\n/**\n * Tests if a value is a TemplateResult or a CompiledTemplateResult.\n */\nexport const isTemplateResult: IsTemplateResult = (\n value: unknown,\n type?: TemplateResultType\n): value is UncompiledTemplateResult =>\n type === undefined\n ? // This property needs to remain unminified.\n (value as UncompiledTemplateResult)?.['_$litType$'] !== undefined\n : (value as UncompiledTemplateResult)?.['_$litType$'] === type;\n\n/**\n * Tests if a value is a CompiledTemplateResult.\n */\nexport const isCompiledTemplateResult = (\n value: unknown\n): value is CompiledTemplateResult => {\n return (value as CompiledTemplateResult)?.['_$litType$']?.h != null;\n};\n\n/**\n * Tests if a value is a DirectiveResult.\n */\nexport const isDirectiveResult = (value: unknown): value is DirectiveResult =>\n // This property needs to remain unminified.\n (value as DirectiveResult)?.['_$litDirective$'] !== undefined;\n\n/**\n * Retrieves the Directive class for a DirectiveResult\n */\nexport const getDirectiveClass = (value: unknown): DirectiveClass | undefined =>\n // This property needs to remain unminified.\n (value as DirectiveResult)?.['_$litDirective$'];\n\n/**\n * Tests whether a part has only a single-expression with no strings to\n * interpolate between.\n *\n * Only AttributePart and PropertyPart can have multiple expressions.\n * Multi-expression parts have a `strings` property and single-expression\n * parts do not.\n */\nexport const isSingleExpression = (part: PartInfo) =>\n (part as AttributePartInfo).strings === undefined;\n\nconst createMarker = () => document.createComment('');\n\n/**\n * Inserts a ChildPart into the given container ChildPart's DOM, either at the\n * end of the container ChildPart, or before the optional `refPart`.\n *\n * This does not add the part to the containerPart's committed value. That must\n * be done by callers.\n *\n * @param containerPart Part within which to add the new ChildPart\n * @param refPart Part before which to add the new ChildPart; when omitted the\n * part added to the end of the `containerPart`\n * @param part Part to insert, or undefined to create a new part\n */\nexport const insertPart = (\n containerPart: ChildPart,\n refPart?: ChildPart,\n part?: ChildPart\n): ChildPart => {\n const container = wrap(containerPart._$startNode).parentNode!;\n\n const refNode =\n refPart === undefined ? containerPart._$endNode : refPart._$startNode;\n\n if (part === undefined) {\n const startNode = wrap(container).insertBefore(createMarker(), refNode);\n const endNode = wrap(container).insertBefore(createMarker(), refNode);\n part = new ChildPart(\n startNode,\n endNode,\n containerPart,\n containerPart.options\n );\n } else {\n const endNode = wrap(part._$endNode!).nextSibling;\n const oldParent = part._$parent;\n const parentChanged = oldParent !== containerPart;\n if (parentChanged) {\n part._$reparentDisconnectables?.(containerPart);\n // Note that although `_$reparentDisconnectables` updates the part's\n // `_$parent` reference after unlinking from its current parent, that\n // method only exists if Disconnectables are present, so we need to\n // unconditionally set it here\n part._$parent = containerPart;\n // Since the _$isConnected getter is somewhat costly, only\n // read it once we know the subtree has directives that need\n // to be notified\n let newConnectionState;\n if (\n part._$notifyConnectionChanged !== undefined &&\n (newConnectionState = containerPart._$isConnected) !==\n oldParent!._$isConnected\n ) {\n part._$notifyConnectionChanged(newConnectionState);\n }\n }\n if (endNode !== refNode || parentChanged) {\n let start: Node | null = part._$startNode;\n while (start !== endNode) {\n const n: Node | null = wrap(start!).nextSibling;\n wrap(container).insertBefore(start!, refNode);\n start = n;\n }\n }\n }\n\n return part;\n};\n\n/**\n * Sets the value of a Part.\n *\n * Note that this should only be used to set/update the value of user-created\n * parts (i.e. those created using `insertPart`); it should not be used\n * by directives to set the value of the directive's container part. Directives\n * should return a value from `update`/`render` to update their part state.\n *\n * For directives that require setting their part value asynchronously, they\n * should extend `AsyncDirective` and call `this.setValue()`.\n *\n * @param part Part to set\n * @param value Value to set\n * @param index For `AttributePart`s, the index to set\n * @param directiveParent Used internally; should not be set by user\n */\nexport const setChildPartValue = <T extends ChildPart>(\n part: T,\n value: unknown,\n directiveParent: DirectiveParent = part\n): T => {\n part._$setValue(value, directiveParent);\n return part;\n};\n\n// A sentinel value that can never appear as a part value except when set by\n// live(). Used to force a dirty-check to fail and cause a re-render.\nconst RESET_VALUE = {};\n\n/**\n * Sets the committed value of a ChildPart directly without triggering the\n * commit stage of the part.\n *\n * This is useful in cases where a directive needs to update the part such\n * that the next update detects a value change or not. When value is omitted,\n * the next update will be guaranteed to be detected as a change.\n *\n * @param part\n * @param value\n */\nexport const setCommittedValue = (part: Part, value: unknown = RESET_VALUE) =>\n (part._$committedValue = value);\n\n/**\n * Returns the committed value of a ChildPart.\n *\n * The committed value is used for change detection and efficient updates of\n * the part. It can differ from the value set by the template or directive in\n * cases where the template value is transformed before being committed.\n *\n * - `TemplateResult`s are committed as a `TemplateInstance`\n * - Iterables are committed as `Array<ChildPart>`\n * - All other types are committed as the template value or value returned or\n * set by a directive.\n *\n * @param part\n */\nexport const getCommittedValue = (part: ChildPart) => part._$committedValue;\n\n/**\n * Removes a ChildPart from the DOM, including any of its content and markers.\n *\n * Note: The only difference between this and clearPart() is that this also\n * removes the part's start node. This means that the ChildPart must own its\n * start node, ie it must be a marker node specifically for this part and not an\n * anchor from surrounding content.\n *\n * @param part The Part to remove\n */\nexport const removePart = (part: ChildPart) => {\n part._$clear();\n part._$startNode.remove();\n};\n\nexport const clearPart = (part: ChildPart) => {\n part._$clear();\n};\n"],"mappings":";;;;;;;;;;;;AA0CO,IA0CMA,IACgBC,wBAAAA,OAC3B,IAAIC,QAA4C,EAE9CC,iBAAqBF,IACrBC,QAAAA,GAAAA,IAJyBD;AAIzBC,IAQkBE,IARlBF,MAQkBE;SAAAA;;;EAkBpB,YAAYC,IAAAA;EAAsB;EAGlC,IAAA,OAAIC;AACF,WAAOC,KAAKC,KAASF;EACvB;EAGA,KACEG,IACAC,IACAC,IAAAA;AAEAJ,SAAKK,OAASH,IACdF,KAAKC,OAAWE,IAChBH,KAAKM,OAAmBF;EAC1B;EAEA,KAAUF,IAAYK,IAAAA;AACpB,WAAOP,KAAKQ,OAAON,IAAMK,EAAAA;EAC3B;EAIA,OAAOE,IAAaF,IAAAA;AAClB,WAAOP,KAAKU,OAAAA,GAAUH,EAAAA;EACxB;AAAA;A;;;;ACvHF,IAAA,EAAOI,GAAYC,EAAAA,IAAaC;AAAhC,IAMMC,KAKCC,8BAAeA,GAAfA;AAXP,IAyCaC,IAAqC,wBAChDC,GACAC,OAAAA,WAEAA,KAAAA,WAEKD,GAAiD,aACjDA,GAAiD,eAAMC,IAPZ;AAzClD,IAqDaC,IACXF,8BAE+D,QAAvDA,GAA+C,YAAGG,GAF1DH;AAtDF,IAoFMI,IAAe,6BAAMC,SAASC,cAAc,EAAA,GAA7B;AApFrB,IAkGaC,IAAa,wBACxBC,GACAC,GACAC,OAAAA;AAEA,QAAMC,KAAiBH,EAAcI,KAAaC,YAE5CC,KAAAA,WACJL,IAAwBD,EAAcO,OAAYN,EAAQG;AAE5D,MAAA,WAAIF,IAAoB;AACtB,UAAMM,KAAiBL,GAAWM,aAAab,EAAAA,GAAgBU,EAAAA,GACzDI,KAAeP,GAAWM,aAAab,EAAAA,GAAgBU,EAAAA;AAC7DJ,IAAAA,KAAO,IAAIS,EACTH,IACAE,IACAV,GACAA,EAAcY,OAAAA;EAElB,OAAO;AACL,UAAMF,KAAeR,GAAKK,KAAYM,aAChCC,KAAYZ,GAAKa,MACjBC,IAAgBF,OAAcd;AACpC,QAAIgB,GAAe;AAUjB,UAAIC;AATJf,MAAAA,GAAKgB,OAA4BlB,CAAAA,GAKjCE,GAAKa,OAAWf,GAAAA,WAMdE,GAAKiB,SACJF,KAAqBjB,EAAcoB,UAClCN,GAAWM,QAEblB,GAAKiB,KAA0BF,EAAAA;IAEnC;AACA,QAAIP,OAAYJ,MAAWU,GAAe;AACxC,UAAIK,KAAqBnB,GAAKE;AAC9B,aAAOiB,OAAUX,MAAS;AACxB,cAAMY,KAAiBC,GAAKF,EAAAA,EAAQR;AACpCU,QAAAA,GAAKpB,EAAAA,EAAWM,aAAaY,IAAQf,EAAAA,GACrCe,KAAQC;MACV;IACF;EACF;AAEA,SAAOpB;AAAAA,GApDiB;AAlG1B,IAoLMsB,IAAc,CAAA;AApLpB,IAiMaC,IAAoB,wBAACC,GAAYC,KAAiBH,MAC5DE,EAAKE,OAAmBD,IADM;AAjMjC,IAkNaE,IAAqBH,8BAAoBA,EAAKE,MAAzBF;AAlNlC,IAmOaI,IAAaC,8BAAAA;AACxBA,IAAKC,KAAAA;AAAAA,GADmBD;","names":["directive","c","values","_$litDirective$","Directive","_partInfo","_$isConnected","this","_$parent","part","parent","attributeIndex","__part","__attributeIndex","props","update","_part","render","_ChildPart","ChildPart","_$LH","wrap","node","isTemplateResult","value","type","isCompiledTemplateResult","h","createMarker","document","createComment","insertPart","containerPart","refPart","part","container","_$startNode","parentNode","refNode","_$endNode","startNode","insertBefore","endNode","ChildPart","options","nextSibling","oldParent","_$parent","parentChanged","newConnectionState","_$reparentDisconnectables","_$notifyConnectionChanged","_$isConnected","start","n","wrap","RESET_VALUE","setCommittedValue","part","value","_$committedValue","getCommittedValue","clearPart","part","_$clear"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-NT5H3ES3.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-OFPH7GQJ.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-OFPH7GQJ.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-OFPH7GQJ.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-OFPH7GQJ.js.map
+679
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-OIQMICML.js
··· 1 + import { 2 + OAuthUserAgent, 3 + login, 4 + logout, 5 + restoreOrFinalize 6 + } from "./chunk-UACRVUBF.js"; 7 + import { 8 + outputManager 9 + } from "./chunk-5UTOUDDD.js"; 10 + import { 11 + BroadcastableDiffuseElement 12 + } from "./chunk-H46AZIKM.js"; 13 + import { 14 + computed, 15 + signal 16 + } from "./chunk-IZOBPV2S.js"; 17 + import { 18 + __name, 19 + init_Buffer, 20 + init_process 21 + } from "./chunk-FZQXS3RE.js"; 22 + 23 + // components/output/raw/atproto/element.js 24 + init_Buffer(); 25 + init_process(); 26 + 27 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/index.js 28 + init_Buffer(); 29 + init_process(); 30 + 31 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/client.js 32 + init_Buffer(); 33 + init_process(); 34 + 35 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/validations/index.js 36 + init_Buffer(); 37 + init_process(); 38 + 39 + // ../node_modules/.deno/@atcute+util-text@1.1.1/node_modules/@atcute/util-text/dist/index.js 40 + init_Buffer(); 41 + init_process(); 42 + var segmenter = new Intl.Segmenter(); 43 + 44 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/bytes.js 45 + init_Buffer(); 46 + init_process(); 47 + 48 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/index.js 49 + init_Buffer(); 50 + init_process(); 51 + 52 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/blob.js 53 + init_Buffer(); 54 + init_process(); 55 + 56 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/cid-link.js 57 + init_Buffer(); 58 + init_process(); 59 + 60 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/validations/utils.js 61 + init_Buffer(); 62 + init_process(); 63 + 64 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/validations/index.js 65 + var xrpcSchemaGenerated = false; 66 + var ok = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (value) => { 67 + return { ok: true, value }; 68 + }, "ok"); 69 + var FLAG_EMPTY = 0; 70 + var FLAG_ABORT_EARLY = 1 << 0; 71 + var cloneIssueWithPath = /* @__PURE__ */ __name((issue, path) => { 72 + const { ok: _ok, msg: _fmt, ...clone } = issue; 73 + return { ...clone, path }; 74 + }, "cloneIssueWithPath"); 75 + var collectIssues = /* @__PURE__ */ __name((tree, path = [], issues = []) => { 76 + for (; ; ) { 77 + switch (tree.code) { 78 + case "join": { 79 + collectIssues(tree.left, path.slice(), issues); 80 + tree = tree.right; 81 + continue; 82 + } 83 + case "prepend": { 84 + path.push(tree.key); 85 + tree = tree.tree; 86 + continue; 87 + } 88 + default: { 89 + issues.push(cloneIssueWithPath(tree, path)); 90 + return issues; 91 + } 92 + } 93 + } 94 + }, "collectIssues"); 95 + var countIssues = /* @__PURE__ */ __name((tree) => { 96 + let count = 0; 97 + for (; ; ) { 98 + switch (tree.code) { 99 + case "join": { 100 + count += countIssues(tree.left); 101 + tree = tree.right; 102 + continue; 103 + } 104 + case "prepend": { 105 + tree = tree.tree; 106 + continue; 107 + } 108 + default: { 109 + return count + 1; 110 + } 111 + } 112 + } 113 + }, "countIssues"); 114 + var formatIssueTree = /* @__PURE__ */ __name((tree) => { 115 + let path = ""; 116 + let count = 0; 117 + for (; ; ) { 118 + switch (tree.code) { 119 + case "join": { 120 + count += countIssues(tree.right); 121 + tree = tree.left; 122 + continue; 123 + } 124 + case "prepend": { 125 + path += `.${tree.key}`; 126 + tree = tree.tree; 127 + continue; 128 + } 129 + } 130 + break; 131 + } 132 + const message = tree.msg(); 133 + let msg = `${tree.code} at ${path || "."} (${message})`; 134 + if (count > 0) { 135 + msg += ` (+${count} other issue(s))`; 136 + } 137 + return msg; 138 + }, "formatIssueTree"); 139 + var ValidationError = class extends Error { 140 + static { 141 + __name(this, "ValidationError"); 142 + } 143 + name = "ValidationError"; 144 + #issueTree; 145 + constructor(issueTree) { 146 + super(); 147 + this.#issueTree = issueTree; 148 + } 149 + get message() { 150 + return formatIssueTree(this.#issueTree); 151 + } 152 + get issues() { 153 + return collectIssues(this.#issueTree); 154 + } 155 + }; 156 + var ErrImpl = class { 157 + static { 158 + __name(this, "ErrImpl"); 159 + } 160 + ok = false; 161 + #issueTree; 162 + constructor(issueTree) { 163 + this.#issueTree = issueTree; 164 + } 165 + get message() { 166 + return formatIssueTree(this.#issueTree); 167 + } 168 + get issues() { 169 + return collectIssues(this.#issueTree); 170 + } 171 + throw() { 172 + throw new ValidationError(this.#issueTree); 173 + } 174 + }; 175 + var safeParse = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (schema, input) => { 176 + const r = schema["~run"](input, FLAG_EMPTY); 177 + if (r === void 0) { 178 + return /* @__PURE__ */ ok(input); 179 + } 180 + if (r.ok) { 181 + return r; 182 + } 183 + return new ErrImpl(r); 184 + }, "safeParse"); 185 + 186 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/fetch-handler.js 187 + init_Buffer(); 188 + init_process(); 189 + var buildFetchHandler = /* @__PURE__ */ __name((handler) => { 190 + if (typeof handler === "object") { 191 + return handler.handle.bind(handler); 192 + } 193 + return handler; 194 + }, "buildFetchHandler"); 195 + 196 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/client.js 197 + var JSON_CONTENT_TYPE_RE = /\bapplication\/json\b/; 198 + var Client = class _Client { 199 + static { 200 + __name(this, "Client"); 201 + } 202 + handler; 203 + proxy; 204 + constructor({ handler, proxy = null }) { 205 + this.handler = buildFetchHandler(handler); 206 + this.proxy = proxy; 207 + } 208 + /** 209 + * clones this XRPC client 210 + * @param opts options to merge with 211 + * @returns the cloned XRPC client 212 + */ 213 + clone({ handler = this.handler, proxy = this.proxy } = {}) { 214 + return new _Client({ handler, proxy }); 215 + } 216 + get(name, options = {}) { 217 + return this.#perform("get", name, options); 218 + } 219 + post(name, options = {}) { 220 + return this.#perform("post", name, options); 221 + } 222 + async call(schema, options = {}) { 223 + if (!xrpcSchemaGenerated) { 224 + return; 225 + } 226 + if ("mainSchema" in schema) { 227 + schema = schema.mainSchema; 228 + } 229 + if (schema.params !== null) { 230 + const paramsResult = safeParse(schema.params, options.params); 231 + if (!paramsResult.ok) { 232 + throw new ClientValidationError("params", paramsResult); 233 + } 234 + } 235 + if (schema.type === "xrpc_procedure" && schema.input?.type === "lex") { 236 + const inputResult = safeParse(schema.input.schema, options.input); 237 + if (!inputResult.ok) { 238 + throw new ClientValidationError("input", inputResult); 239 + } 240 + } 241 + const isQuery = schema.type === "xrpc_query"; 242 + const method = isQuery ? "get" : "post"; 243 + if (options.as === void 0 && schema.output?.type === "blob") { 244 + throw new TypeError(`\`as\` option is required for endpoints returning blobs`); 245 + } 246 + const format = options.as !== void 0 ? options.as : schema.output?.type === "lex" ? "json" : null; 247 + const response = await this.#perform(method, schema.nsid, { 248 + params: options.params, 249 + input: isQuery ? void 0 : options.input, 250 + as: format, 251 + signal: options.signal, 252 + headers: options.headers 253 + }); 254 + if (format === "json" && response.ok && schema.output?.type === "lex") { 255 + const outputResult = safeParse(schema.output.schema, response.data); 256 + if (!outputResult.ok) { 257 + throw new ClientValidationError("output", outputResult); 258 + } 259 + return { 260 + ok: true, 261 + status: response.status, 262 + headers: response.headers, 263 + data: outputResult.value 264 + }; 265 + } 266 + return response; 267 + } 268 + async #perform(method, name, { signal: signal2, as: format = "json", headers, input, params }) { 269 + const isWebInput = input && (input instanceof Blob || ArrayBuffer.isView(input) || input instanceof ArrayBuffer || input instanceof ReadableStream); 270 + const url = `/xrpc/${name}` + _constructSearchParams(params); 271 + const response = await this.handler(url, { 272 + method, 273 + signal: signal2, 274 + body: input && !isWebInput ? JSON.stringify(input) : input, 275 + headers: _mergeHeaders(headers, { 276 + "content-type": input && !isWebInput ? "application/json" : null, 277 + "atproto-proxy": _constructProxyHeader(this.proxy) 278 + }), 279 + duplex: input instanceof ReadableStream ? "half" : void 0 280 + }); 281 + { 282 + const status = response.status; 283 + const headers2 = response.headers; 284 + const type = headers2.get("content-type"); 285 + if (status !== 200) { 286 + let json; 287 + if (type != null && JSON_CONTENT_TYPE_RE.test(type)) { 288 + try { 289 + const parsed = await response.json(); 290 + if (isXRPCErrorPayload(parsed)) { 291 + json = parsed; 292 + } 293 + } catch { 294 + } 295 + } else { 296 + await response.body?.cancel(); 297 + } 298 + return { 299 + ok: false, 300 + status, 301 + headers: headers2, 302 + data: json ?? { 303 + error: `UnknownXRPCError`, 304 + message: `Request failed with status code ${status}` 305 + } 306 + }; 307 + } 308 + { 309 + let data; 310 + switch (format) { 311 + case "json": { 312 + if (type != null && JSON_CONTENT_TYPE_RE.test(type)) { 313 + data = await response.json(); 314 + } else { 315 + await response.body?.cancel(); 316 + throw new TypeError(`Invalid response content-type (got ${type})`); 317 + } 318 + break; 319 + } 320 + case null: { 321 + data = null; 322 + await response.body?.cancel(); 323 + break; 324 + } 325 + case "blob": { 326 + data = await response.blob(); 327 + break; 328 + } 329 + case "bytes": { 330 + data = new Uint8Array(await response.arrayBuffer()); 331 + break; 332 + } 333 + case "stream": { 334 + data = response.body; 335 + break; 336 + } 337 + } 338 + return { 339 + ok: true, 340 + status, 341 + headers: headers2, 342 + data 343 + }; 344 + } 345 + } 346 + } 347 + }; 348 + var _constructSearchParams = /* @__PURE__ */ __name((params) => { 349 + let searchParams; 350 + for (const key in params) { 351 + const value = params[key]; 352 + if (value !== void 0) { 353 + searchParams ??= new URLSearchParams(); 354 + if (Array.isArray(value)) { 355 + for (let idx = 0, len = value.length; idx < len; idx++) { 356 + const val = value[idx]; 357 + searchParams.append(key, "" + val); 358 + } 359 + } else { 360 + searchParams.set(key, "" + value); 361 + } 362 + } 363 + } 364 + return searchParams ? `?` + searchParams.toString() : ""; 365 + }, "_constructSearchParams"); 366 + var _constructProxyHeader = /* @__PURE__ */ __name((proxy) => { 367 + if (proxy != null) { 368 + return `${proxy.did}${proxy.serviceId}`; 369 + } 370 + return null; 371 + }, "_constructProxyHeader"); 372 + var _mergeHeaders = /* @__PURE__ */ __name((init, defaults) => { 373 + let headers; 374 + for (const name in defaults) { 375 + const value = defaults[name]; 376 + if (value !== null) { 377 + headers ??= new Headers(init); 378 + if (!headers.has(name)) { 379 + headers.set(name, value); 380 + } 381 + } 382 + } 383 + return headers ?? init; 384 + }, "_mergeHeaders"); 385 + var isXRPCErrorPayload = /* @__PURE__ */ __name((input) => { 386 + if (typeof input !== "object" || input == null) { 387 + return false; 388 + } 389 + const kindType = typeof input.error; 390 + const messageType = typeof input.message; 391 + return kindType === "string" && (messageType === "undefined" || messageType === "string"); 392 + }, "isXRPCErrorPayload"); 393 + var ok2 = /* @__PURE__ */ __name((input) => { 394 + if (input instanceof Promise) { 395 + return input.then(ok2); 396 + } 397 + if (input.ok) { 398 + return input.data; 399 + } 400 + throw new ClientResponseError(input); 401 + }, "ok"); 402 + var ClientResponseError = class extends Error { 403 + static { 404 + __name(this, "ClientResponseError"); 405 + } 406 + /** error name returned by service */ 407 + error; 408 + /** error message returned by service */ 409 + description; 410 + /** response status */ 411 + status; 412 + /** response headers */ 413 + headers; 414 + constructor({ status, headers = new Headers(), data }) { 415 + super(`${data.error} > ${data.message ?? "(unspecified description)"}`); 416 + this.name = "ClientResponseError"; 417 + this.error = data.error; 418 + this.description = data.message; 419 + this.status = status; 420 + this.headers = headers; 421 + } 422 + }; 423 + var ClientValidationError = class extends Error { 424 + static { 425 + __name(this, "ClientValidationError"); 426 + } 427 + /** validation target (params, input, or output) */ 428 + target; 429 + /** validation result */ 430 + result; 431 + constructor(target, result) { 432 + super(`validation failed for ${target}: ${result.message}`); 433 + this.name = "ClientValidationError"; 434 + this.target = target; 435 + this.result = result; 436 + } 437 + }; 438 + 439 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/credential-manager.js 440 + init_Buffer(); 441 + init_process(); 442 + 443 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/utils/jwt.js 444 + init_Buffer(); 445 + init_process(); 446 + 447 + // components/output/raw/atproto/element.js 448 + var ATProtoOutput = class extends BroadcastableDiffuseElement { 449 + static { 450 + __name(this, "ATProtoOutput"); 451 + } 452 + static NAME = "diffuse/output/raw/atproto"; 453 + #manager; 454 + /** @type {PromiseWithResolvers<void>} */ 455 + #authenticated = Promise.withResolvers(); 456 + /** @type {Client | null} */ 457 + #rpc = null; 458 + /** @type {OAuthUserAgent | null} */ 459 + #agent = null; 460 + constructor() { 461 + super(); 462 + this.#manager = outputManager({ 463 + facets: { 464 + empty: /* @__PURE__ */ __name(() => [], "empty"), 465 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.facet"), "get"), 466 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.facet", data), "put") 467 + }, 468 + playlists: { 469 + empty: /* @__PURE__ */ __name(() => [], "empty"), 470 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.playlist"), "get"), 471 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.playlist", data), "put") 472 + }, 473 + themes: { 474 + empty: /* @__PURE__ */ __name(() => [], "empty"), 475 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.theme"), "get"), 476 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.theme", data), "put") 477 + }, 478 + tracks: { 479 + empty: /* @__PURE__ */ __name(() => [], "empty"), 480 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.track"), "get"), 481 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.track", data), "put") 482 + } 483 + }); 484 + this.facets = this.#manager.facets; 485 + this.playlists = this.#manager.playlists; 486 + this.themes = this.#manager.themes; 487 + this.tracks = this.#manager.tracks; 488 + } 489 + // SIGNALS 490 + #did = signal( 491 + /** @type {string | null} */ 492 + null 493 + ); 494 + // STATE 495 + did = this.#did.get; 496 + ready = computed(() => { 497 + return this.#did.value !== null && navigator.onLine; 498 + }); 499 + // LIFECYCLE 500 + /** @override */ 501 + connectedCallback() { 502 + if (this.hasAttribute("group")) { 503 + const actions = this.broadcast(this.nameWithGroup, { 504 + put: { strategy: "replicate", fn: this.#putIncoming } 505 + }); 506 + if (actions) { 507 + this.#put = this.#putOutgoing(actions.put); 508 + } 509 + } 510 + super.connectedCallback(); 511 + this.#tryRestore(); 512 + } 513 + // AUTH 514 + async #tryRestore() { 515 + await this.whenConnected(); 516 + const session = await restoreOrFinalize(); 517 + if (session) { 518 + this.#setSession(session); 519 + } 520 + } 521 + /** 522 + * @param {import("@atcute/oauth-browser-client").Session} session 523 + */ 524 + #setSession(session) { 525 + this.#agent = new OAuthUserAgent(session); 526 + this.#rpc = new Client({ handler: this.#agent }); 527 + this.#did.value = session.info.sub; 528 + this.#authenticated.resolve(); 529 + } 530 + /** 531 + * Initiate the OAuth flow. 532 + * Navigates the browser to the authorization server. 533 + * 534 + * @param {string} handle 535 + */ 536 + async login(handle) { 537 + await login(handle); 538 + } 539 + /** 540 + * Sign out and revoke the current session. 541 + */ 542 + async logout() { 543 + if (this.#agent) { 544 + await logout(this.#agent); 545 + this.#agent = null; 546 + this.#authenticated = Promise.withResolvers(); 547 + this.#did.value = null; 548 + this.#rpc = null; 549 + } 550 + } 551 + // RECORDS 552 + /** 553 + * @template T 554 + * @param {string} collection 555 + * @returns {Promise<T[]>} 556 + */ 557 + async #listRecords(collection) { 558 + if (!this.#rpc || !this.#did.value) return []; 559 + const records = []; 560 + let cursor; 561 + do { 562 + const page = await ok2(this.#rpc.get( 563 + "com.atproto.repo.listRecords", 564 + { params: { repo: this.#did.value, collection, limit: 100, cursor } } 565 + )); 566 + for (const record of page.records) { 567 + records.push(record.value); 568 + } 569 + cursor = page.cursor; 570 + } while (cursor); 571 + return records; 572 + } 573 + /** 574 + * @param {string} collection 575 + * @param {Array<{ id: string }>} data 576 + */ 577 + async #putRecordsSync(collection, data) { 578 + if (!this.#rpc || !this.#did.value) return; 579 + const existing = /* @__PURE__ */ new Map(); 580 + let cursor; 581 + do { 582 + const page = await ok2(this.#rpc.get( 583 + "com.atproto.repo.listRecords", 584 + { params: { repo: this.#did.value, collection, limit: 100, cursor } } 585 + )); 586 + for (const record of page.records) { 587 + const rkey = record.uri.split("/").pop(); 588 + existing.set(record.value.id, { rkey, value: record.value }); 589 + } 590 + cursor = page.cursor; 591 + } while (cursor); 592 + const desired = new Map( 593 + data.map((record) => [record.id, { $type: collection, ...record }]) 594 + ); 595 + const writes = []; 596 + for (const [id, { rkey }] of existing) { 597 + if (!desired.has(id)) { 598 + writes.push({ 599 + $type: "com.atproto.repo.applyWrites#delete", 600 + collection, 601 + rkey 602 + }); 603 + } 604 + } 605 + for (const [id, record] of desired) { 606 + const entry = existing.get(id); 607 + if (!entry) { 608 + writes.push({ 609 + $type: "com.atproto.repo.applyWrites#create", 610 + collection, 611 + rkey: id, 612 + value: record 613 + }); 614 + } else if (JSON.stringify(entry.value) !== JSON.stringify(record)) { 615 + writes.push({ 616 + $type: "com.atproto.repo.applyWrites#update", 617 + collection, 618 + rkey: entry.rkey, 619 + value: record 620 + }); 621 + } 622 + } 623 + if (writes.length > 0) { 624 + await this.#rpc.post("com.atproto.repo.applyWrites", { 625 + input: { repo: this.#did.value, writes } 626 + }); 627 + } 628 + } 629 + // GET & PUT (broadcasting layer) 630 + /** 631 + * @param {string} collection 632 + * @param {Array<{ id: string }>} data 633 + */ 634 + #putProxy = /* @__PURE__ */ __name((collection, data) => this.#putRecordsSync(collection, data), "#putProxy"); 635 + #put = this.#putProxy; 636 + /** 637 + * @param {string} collection 638 + * @param {Array<{ id: string }>} data 639 + */ 640 + #putRecords = /* @__PURE__ */ __name((collection, data) => this.#put(collection, data), "#putRecords"); 641 + /** 642 + * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, collection: string, data: Array<{ id: string }>) => Promise<void>} action 643 + * @returns {(collection: string, data: Array<{ id: string }>) => Promise<void>} 644 + */ 645 + #putOutgoing = /* @__PURE__ */ __name((action) => async (collection, data) => { 646 + return await action(this.uuid, collection, data); 647 + }, "#putOutgoing"); 648 + /** 649 + * @param {ReturnType<typeof crypto.randomUUID>} uuidSender 650 + * @param {string} collection 651 + * @param {Array<{ id: string }>} data 652 + */ 653 + #putIncoming(uuidSender, collection, data) { 654 + if (uuidSender === this.uuid) { 655 + this.#putProxy(collection, data); 656 + } else { 657 + const collectionMap = { 658 + "sh.diffuse.output.facet": this.#manager.signals.facets, 659 + "sh.diffuse.output.playlist": this.#manager.signals.playlists, 660 + "sh.diffuse.output.theme": this.#manager.signals.themes, 661 + "sh.diffuse.output.track": this.#manager.signals.tracks 662 + }; 663 + const sig = collectionMap[collection]; 664 + if (sig) sig.value = data; 665 + } 666 + } 667 + }; 668 + var element_default = ATProtoOutput; 669 + var CLASS = ATProtoOutput; 670 + var NAME = "dor-atproto"; 671 + customElements.define(NAME, ATProtoOutput); 672 + 673 + export { 674 + element_default, 675 + CLASS, 676 + NAME 677 + }; 678 + 679 + //# sourceMappingURL=./chunk-OIQMICML.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-OIQMICML.js.map
··· 1 + {"version":3,"sources":["/components/output/raw/atproto/element.js","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/index.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/client.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/validations/index.ts","/node_modules/.deno/@atcute+util-text@1.1.1/node_modules/@atcute/util-text/lib/index.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/bytes.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/index.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/blob.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/cid-link.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/validations/utils.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/fetch-handler.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/credential-manager.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/utils/jwt.ts"],"sourcesContent":["import { Client, ok } from \"@atcute/client\";\nimport { BroadcastableDiffuseElement } from \"@common/element.js\";\nimport { computed, signal } from \"@common/signal.js\";\nimport { outputManager } from \"../../common.js\";\nimport { login, logout, OAuthUserAgent, restoreOrFinalize } from \"./oauth.js\";\n\n/**\n * @import {Signal} from \"@common/signal.d.ts\"\n * @import {OutputManager} from \"../../types.d.ts\"\n * @import {ATProtoOutputElement} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ATProtoOutputElement}\n */\nclass ATProtoOutput extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/output/raw/atproto\";\n\n #manager;\n\n /** @type {PromiseWithResolvers<void>} */\n #authenticated = Promise.withResolvers();\n\n /** @type {Client | null} */\n #rpc = null;\n\n /** @type {OAuthUserAgent | null} */\n #agent = null;\n\n constructor() {\n super();\n\n /** @type {OutputManager} */\n this.#manager = outputManager({\n facets: {\n empty: () => [],\n get: () => this.#listRecords(\"sh.diffuse.output.facet\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.facet\", data),\n },\n playlists: {\n empty: () => [],\n get: () => this.#listRecords(\"sh.diffuse.output.playlist\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.playlist\", data),\n },\n themes: {\n empty: () => [],\n get: () => this.#listRecords(\"sh.diffuse.output.theme\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.theme\", data),\n },\n tracks: {\n empty: () => [],\n get: () => this.#listRecords(\"sh.diffuse.output.track\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.track\", data),\n },\n });\n\n this.facets = this.#manager.facets;\n this.playlists = this.#manager.playlists;\n this.themes = this.#manager.themes;\n this.tracks = this.#manager.tracks;\n }\n\n // SIGNALS\n\n #did = signal(/** @type {string | null} */ (null));\n\n // STATE\n\n did = this.#did.get;\n\n ready = computed(() => {\n return this.#did.value !== null && navigator.onLine\n });\n\n // LIFECYCLE\n\n /** @override */\n connectedCallback() {\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n put: { strategy: \"replicate\", fn: this.#putIncoming },\n });\n\n if (actions) {\n this.#put = this.#putOutgoing(actions.put);\n }\n }\n\n super.connectedCallback();\n\n this.#tryRestore();\n }\n\n // AUTH\n\n async #tryRestore() {\n await this.whenConnected();\n\n const session = await restoreOrFinalize();\n\n if (session) {\n this.#setSession(session);\n }\n }\n\n /**\n * @param {import(\"@atcute/oauth-browser-client\").Session} session\n */\n #setSession(session) {\n this.#agent = new OAuthUserAgent(session);\n this.#rpc = new Client({ handler: this.#agent });\n this.#did.value = session.info.sub;\n this.#authenticated.resolve();\n }\n\n /**\n * Initiate the OAuth flow.\n * Navigates the browser to the authorization server.\n *\n * @param {string} handle\n */\n async login(handle) {\n await login(handle);\n }\n\n /**\n * Sign out and revoke the current session.\n */\n async logout() {\n if (this.#agent) {\n await logout(this.#agent);\n this.#agent = null;\n this.#authenticated = Promise.withResolvers();\n this.#did.value = null;\n this.#rpc = null;\n }\n }\n\n // RECORDS\n\n /**\n * @template T\n * @param {string} collection\n * @returns {Promise<T[]>}\n */\n async #listRecords(collection) {\n if (!this.#rpc || !this.#did.value) return [];\n\n const records = [];\n let cursor;\n\n do {\n /** @type {any} */\n const page = await ok(this.#rpc.get(\n \"com.atproto.repo.listRecords\",\n { params: { repo: this.#did.value, collection, limit: 100, cursor } },\n ));\n\n for (const record of page.records) {\n records.push(record.value);\n }\n\n cursor = page.cursor;\n } while (cursor);\n\n return records;\n }\n\n /**\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n async #putRecordsSync(collection, data) {\n if (!this.#rpc || !this.#did.value) return;\n\n // 1. Fetch current state\n /** @type {Map<string, { rkey: string, value: unknown }>} */\n const existing = new Map();\n let cursor;\n\n do {\n /** @type {any} */\n const page = await ok(this.#rpc.get(\n \"com.atproto.repo.listRecords\",\n { params: { repo: this.#did.value, collection, limit: 100, cursor } },\n ));\n\n for (const record of page.records) {\n const rkey = record.uri.split(\"/\").pop();\n existing.set(record.value.id, { rkey, value: record.value });\n }\n\n cursor = page.cursor;\n } while (cursor);\n\n // 2. Build desired state\n const desired = new Map(\n data.map((record) => [record.id, { $type: collection, ...record }]),\n );\n\n // 3. Compute diff\n /** @type {unknown[]} */\n const writes = [];\n\n for (const [id, { rkey }] of existing) {\n if (!desired.has(id)) {\n writes.push({\n $type: \"com.atproto.repo.applyWrites#delete\",\n collection,\n rkey,\n });\n }\n }\n\n for (const [id, record] of desired) {\n const entry = existing.get(id);\n\n if (!entry) {\n writes.push({\n $type: \"com.atproto.repo.applyWrites#create\",\n collection,\n rkey: id,\n value: record,\n });\n } else if (JSON.stringify(entry.value) !== JSON.stringify(record)) {\n writes.push({\n $type: \"com.atproto.repo.applyWrites#update\",\n collection,\n rkey: entry.rkey,\n value: record,\n });\n }\n }\n\n // 4. Apply\n if (writes.length > 0) {\n await this.#rpc.post(\"com.atproto.repo.applyWrites\", {\n input: { repo: this.#did.value, writes },\n });\n }\n }\n\n // GET & PUT (broadcasting layer)\n\n /**\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #putProxy = (collection, data) => this.#putRecordsSync(collection, data);\n #put = this.#putProxy;\n\n /**\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #putRecords = (collection, data) => this.#put(collection, data);\n\n /**\n * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, collection: string, data: Array<{ id: string }>) => Promise<void>} action\n * @returns {(collection: string, data: Array<{ id: string }>) => Promise<void>}\n */\n #putOutgoing = (action) => async (collection, data) => {\n return await action(this.uuid, collection, data);\n };\n\n /**\n * @param {ReturnType<typeof crypto.randomUUID>} uuidSender\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #putIncoming(uuidSender, collection, data) {\n if (uuidSender === this.uuid) {\n this.#putProxy(collection, data);\n } else {\n /** @type {Record<string, Signal<unknown[]>>} */\n const collectionMap = {\n \"sh.diffuse.output.facet\": this.#manager.signals.facets,\n \"sh.diffuse.output.playlist\": this.#manager.signals.playlists,\n \"sh.diffuse.output.theme\": this.#manager.signals.themes,\n \"sh.diffuse.output.track\": this.#manager.signals.tracks,\n };\n\n const sig = collectionMap[collection];\n if (sig) sig.value = data;\n }\n }\n}\n\nexport default ATProtoOutput;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ATProtoOutput;\nexport const NAME = \"dor-atproto\";\n\ncustomElements.define(NAME, ATProtoOutput);\n","export * from './client.js';\nexport * from './fetch-handler.js';\nexport * from './credential-manager.js';\n","import type { Did } from '@atcute/lexicons';\nimport type { XRPCProcedures, XRPCQueries } from '@atcute/lexicons/ambient';\nimport * as v from '@atcute/lexicons/validations';\nimport type {\n\tInferInput,\n\tInferOutput,\n\tObjectSchema,\n\tXRPCBlobBodyParam,\n\tXRPCLexBodyParam,\n\tXRPCProcedureMetadata,\n\tXRPCQueryMetadata,\n} from '@atcute/lexicons/validations';\n\nimport { buildFetchHandler, type FetchHandler, type FetchHandlerObject } from './fetch-handler.js';\n\n// #region Type utilities\ntype RequiredKeysOf<TType extends object> = TType extends any\n\t? Exclude<\n\t\t\t{\n\t\t\t\t[Key in keyof TType]: TType extends Record<Key, TType[Key]> ? Key : never;\n\t\t\t}[keyof TType],\n\t\t\tundefined\n\t\t>\n\t: never;\n\ntype HasRequiredKeys<TType extends object> = RequiredKeysOf<TType> extends never ? false : true;\n\n// #endregion\n\n// #region Type definitions for response formats\ntype ResponseFormat = 'json' | 'blob' | 'bytes' | 'stream';\n\ntype FormattedResponse<TDef> = {\n\tjson: TDef extends XRPCQueryMetadata<any, infer Body extends XRPCLexBodyParam, any>\n\t\t? InferOutput<Body['schema']>\n\t\t: TDef extends XRPCProcedureMetadata<any, any, infer Body extends XRPCLexBodyParam, any>\n\t\t\t? InferOutput<Body['schema']>\n\t\t\t: unknown;\n\tblob: Blob;\n\tbytes: Uint8Array;\n\tstream: ReadableStream<Uint8Array>;\n};\n\n// #endregion\n\n// #region Type definitions for request options\ntype BaseRequestOptions = {\n\tsignal?: AbortSignal;\n\theaders?: HeadersInit;\n};\n\nexport type QueryRequestOptions<TDef> = BaseRequestOptions &\n\t(TDef extends XRPCQueryMetadata<infer Params, infer Output, any>\n\t\t? (Params extends ObjectSchema\n\t\t\t\t? // query has parameters\n\t\t\t\t\t{ params: InferInput<Params> }\n\t\t\t\t: // query has no parameters\n\t\t\t\t\t{ params?: Record<string, unknown> }) &\n\t\t\t\t(Output extends XRPCLexBodyParam // query has JSON response, format is optionally specified\n\t\t\t\t\t? { as?: ResponseFormat | null }\n\t\t\t\t\t: // query doesn't have JSON response, format needs to be specified\n\t\t\t\t\t\t{ as: ResponseFormat | null })\n\t\t: {\n\t\t\t\tas: ResponseFormat | null;\n\t\t\t\tparams?: Record<string, unknown>;\n\t\t\t});\n\nexport type ProcedureRequestOptions<TDef> = BaseRequestOptions &\n\t(TDef extends XRPCProcedureMetadata<infer Params, infer Input, infer Output, any>\n\t\t? (Params extends ObjectSchema\n\t\t\t\t? // procedure has parameters\n\t\t\t\t\t{ params: InferInput<Params> }\n\t\t\t\t: // procedure has no parameters\n\t\t\t\t\t{ params?: Record<string, unknown> }) &\n\t\t\t\t(Input extends XRPCLexBodyParam\n\t\t\t\t\t? // procedure requires JSON input\n\t\t\t\t\t\t{ input: InferInput<Input['schema']> }\n\t\t\t\t\t: Input extends XRPCBlobBodyParam\n\t\t\t\t\t\t? // procedure requires blob\n\t\t\t\t\t\t\t{ input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream }\n\t\t\t\t\t\t: // procedure doesn't specify input\n\t\t\t\t\t\t\t{ input?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream }) &\n\t\t\t\t(Output extends XRPCLexBodyParam\n\t\t\t\t\t? // procedure has JSON response, format is optionally specified\n\t\t\t\t\t\t{ as?: ResponseFormat | null }\n\t\t\t\t\t: // procedure doesn't have JSON response, format needs to be specified\n\t\t\t\t\t\t{ as: ResponseFormat | null })\n\t\t: {\n\t\t\t\tas: ResponseFormat | null;\n\t\t\t\tinput?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream;\n\t\t\t\tparams?: Record<string, unknown>;\n\t\t\t});\n\nexport type CallRequestOptions<TMeta> = BaseRequestOptions &\n\t// as is required if the endpoint returns blob, optional otherwise\n\t(TMeta extends XRPCQueryMetadata<any, infer Output, any>\n\t\t? Output extends XRPCBlobBodyParam\n\t\t\t? { as: ResponseFormat | null }\n\t\t\t: { as?: ResponseFormat | null }\n\t\t: TMeta extends XRPCProcedureMetadata<any, any, infer Output, any>\n\t\t\t? Output extends XRPCBlobBodyParam\n\t\t\t\t? { as: ResponseFormat | null }\n\t\t\t\t: { as?: ResponseFormat | null }\n\t\t\t: { as?: ResponseFormat | null }) &\n\t(TMeta extends XRPCQueryMetadata<infer Params, any, any>\n\t\t? // query\n\t\t\tParams extends ObjectSchema\n\t\t\t? { params: InferInput<Params> }\n\t\t\t: { params?: Record<string, unknown> }\n\t\t: TMeta extends XRPCProcedureMetadata<infer Params, infer Input, any, any>\n\t\t\t? // procedure\n\t\t\t\t(Params extends ObjectSchema\n\t\t\t\t\t? { params: InferInput<Params> }\n\t\t\t\t\t: { params?: Record<string, unknown> }) &\n\t\t\t\t\t(Input extends XRPCLexBodyParam\n\t\t\t\t\t\t? { input: InferInput<Input['schema']> }\n\t\t\t\t\t\t: Input extends XRPCBlobBodyParam\n\t\t\t\t\t\t\t? { input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream }\n\t\t\t\t\t\t\t: { input?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream })\n\t\t\t: never);\n\ntype InternalRequestOptions = BaseRequestOptions & {\n\tas?: ResponseFormat | null;\n\tparams?: Record<string, unknown>;\n\tinput?: Record<string, unknown> | Blob | BufferSource | ReadableStream;\n};\n\n// #endregion\n\n// #region Type definitions for client response\n/** standard XRPC error payload structure */\nexport type XRPCErrorPayload = {\n\t/** error name */\n\terror: string;\n\t/** error description */\n\tmessage?: string;\n};\n\ntype BaseClientResponse = {\n\t/** response status */\n\tstatus: number;\n\t/** response headers */\n\theaders: Headers;\n};\n\n/** represents a successful response returned by the client */\nexport type SuccessClientResponse<TDef, TInit> = BaseClientResponse & {\n\tok: true;\n\t/** response data */\n\tdata: TInit extends { as: infer TFormat }\n\t\t? TFormat extends ResponseFormat\n\t\t\t? FormattedResponse<TDef>[TFormat]\n\t\t\t: TFormat extends null\n\t\t\t\t? null\n\t\t\t\t: never\n\t\t: TDef extends XRPCQueryMetadata<any, infer Body, any>\n\t\t\t? Body extends XRPCLexBodyParam\n\t\t\t\t? InferOutput<Body['schema']>\n\t\t\t\t: null\n\t\t\t: TDef extends XRPCProcedureMetadata<any, any, infer Body, any>\n\t\t\t\t? Body extends XRPCLexBodyParam\n\t\t\t\t\t? InferOutput<Body['schema']>\n\t\t\t\t\t: null\n\t\t\t\t: never;\n};\n\n/** represents a failed response returned by the client */\nexport type FailedClientResponse = BaseClientResponse & {\n\tok: false;\n\t/** response data */\n\tdata: XRPCErrorPayload;\n};\n\n/** represents a response returned by the client */\nexport type ClientResponse<TDef, TInit> = SuccessClientResponse<TDef, TInit> | FailedClientResponse;\n\ntype UnknownClientResponse = { status: number; headers: Headers } & (\n\t| { ok: true; data: unknown }\n\t| { ok: false; data: XRPCErrorPayload }\n);\n\n// #endregion\n\n// #region Type definitions for call method\ntype Namespaced<T> = { mainSchema: T };\n\n// #endregion\n\n// #region Client\n/** options for configuring service proxying */\nexport type ServiceProxyOptions = {\n\t/** DID identifier that the upstream service should look up */\n\tdid: Did;\n\t/**\n\t * the specific service ID within the resolved DID document's `service` array\n\t * that the upstream service should forward requests to.\n\t *\n\t * must start with `#`\n\t *\n\t * common values include:\n\t * - `#atproto_pds` (personal data server)\n\t * - `#atproto_labeler` (labeler service)\n\t * - `#bsky_chat` (Bluesky chat service)\n\t */\n\tserviceId: `#${string}`;\n};\n\n/** options for configuring the client */\nexport type ClientOptions = {\n\t/** the underlying fetch handler it should make requests with */\n\thandler: FetchHandler | FetchHandlerObject;\n\t/** service proxy configuration */\n\tproxy?: ServiceProxyOptions | null;\n};\n\nconst JSON_CONTENT_TYPE_RE = /\\bapplication\\/json\\b/;\n\n/** XRPC API client */\nexport class Client<TQueries = XRPCQueries, TProcedures = XRPCProcedures> {\n\thandler: FetchHandler;\n\tproxy: ServiceProxyOptions | null;\n\n\tconstructor({ handler, proxy = null }: ClientOptions) {\n\t\tthis.handler = buildFetchHandler(handler);\n\t\tthis.proxy = proxy;\n\t}\n\n\t/**\n\t * clones this XRPC client\n\t * @param opts options to merge with\n\t * @returns the cloned XRPC client\n\t */\n\tclone({ handler = this.handler, proxy = this.proxy }: Partial<ClientOptions> = {}): Client<\n\t\tTQueries,\n\t\tTProcedures\n\t> {\n\t\treturn new Client({ handler, proxy });\n\t}\n\n\t/**\n\t * performs an XRPC query request (HTTP GET)\n\t * @param name NSID of the query\n\t * @param options query options\n\t */\n\tget<TName extends keyof TQueries, TInit extends QueryRequestOptions<TQueries[TName]>>(\n\t\tname: TName,\n\t\t...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]\n\t): Promise<ClientResponse<TQueries[TName], TInit>>;\n\n\tget(name: string, options: InternalRequestOptions = {}) {\n\t\treturn this.#perform('get', name, options);\n\t}\n\n\t/**\n\t * performs an XRPC procedure request (HTTP POST)\n\t * @param name NSID of the procedure\n\t * @param options procedure options\n\t */\n\tpost<TName extends keyof TProcedures, TInit extends ProcedureRequestOptions<TProcedures[TName]>>(\n\t\tname: TName,\n\t\t...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]\n\t): Promise<ClientResponse<TProcedures[TName], TInit>>;\n\n\tpost(name: string, options: InternalRequestOptions = {}) {\n\t\treturn this.#perform('post', name, options);\n\t}\n\n\t/**\n\t * performs an XRPC call with schema validation\n\t * @param schema the lexicon schema for the endpoint, or a namespace containing mainSchema\n\t * @param options call options\n\t */\n\tcall<TMeta extends XRPCQueryMetadata | XRPCProcedureMetadata, TInit extends CallRequestOptions<TMeta>>(\n\t\tschema: TMeta | Namespaced<TMeta>,\n\t\t...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]\n\t): Promise<ClientResponse<TMeta, TInit>>;\n\n\tasync call(schema: any, options: any = {}): Promise<any> {\n\t\t// early bailout for tree-shaking when schemas aren't used\n\t\tif (!v.xrpcSchemaGenerated) {\n\t\t\treturn;\n\t\t}\n\n\t\t// extract mainSchema if namespace was passed\n\t\tif ('mainSchema' in schema) {\n\t\t\tschema = schema.mainSchema;\n\t\t}\n\n\t\tif (schema.params !== null) {\n\t\t\tconst paramsResult = v.safeParse(schema.params, options.params);\n\t\t\tif (!paramsResult.ok) {\n\t\t\t\tthrow new ClientValidationError('params', paramsResult);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.type === 'xrpc_procedure' && schema.input?.type === 'lex') {\n\t\t\tconst inputResult = v.safeParse(schema.input.schema, options.input);\n\t\t\tif (!inputResult.ok) {\n\t\t\t\tthrow new ClientValidationError('input', inputResult);\n\t\t\t}\n\t\t}\n\n\t\tconst isQuery = schema.type === 'xrpc_query';\n\t\tconst method = isQuery ? 'get' : 'post';\n\n\t\tif (options.as === undefined && schema.output?.type === 'blob') {\n\t\t\tthrow new TypeError(`\\`as\\` option is required for endpoints returning blobs`);\n\t\t}\n\n\t\tconst format = options.as !== undefined ? options.as : schema.output?.type === 'lex' ? 'json' : null;\n\n\t\tconst response = await this.#perform(method, schema.nsid, {\n\t\t\tparams: options.params,\n\t\t\tinput: isQuery ? undefined : options.input,\n\t\t\tas: format,\n\t\t\tsignal: options.signal,\n\t\t\theaders: options.headers,\n\t\t});\n\n\t\tif (format === 'json' && response.ok && schema.output?.type === 'lex') {\n\t\t\tconst outputResult = v.safeParse(schema.output.schema, response.data);\n\t\t\tif (!outputResult.ok) {\n\t\t\t\tthrow new ClientValidationError('output', outputResult);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t\tdata: outputResult.value,\n\t\t\t};\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tasync #perform(\n\t\tmethod: 'get' | 'post',\n\t\tname: string,\n\t\t{ signal, as: format = 'json', headers, input, params }: InternalRequestOptions,\n\t) {\n\t\tconst isWebInput =\n\t\t\tinput &&\n\t\t\t(input instanceof Blob ||\n\t\t\t\tArrayBuffer.isView(input) ||\n\t\t\t\tinput instanceof ArrayBuffer ||\n\t\t\t\tinput instanceof ReadableStream);\n\n\t\tconst url = `/xrpc/${name}` + _constructSearchParams(params);\n\n\t\tconst response = await this.handler(url, {\n\t\t\tmethod,\n\t\t\tsignal,\n\t\t\tbody: input && !isWebInput ? JSON.stringify(input) : input,\n\t\t\theaders: _mergeHeaders(headers, {\n\t\t\t\t'content-type': input && !isWebInput ? 'application/json' : null,\n\t\t\t\t'atproto-proxy': _constructProxyHeader(this.proxy),\n\t\t\t}),\n\t\t\tduplex: input instanceof ReadableStream ? 'half' : undefined,\n\t\t});\n\n\t\t{\n\t\t\tconst status = response.status;\n\t\t\tconst headers = response.headers;\n\n\t\t\tconst type = headers.get('content-type');\n\n\t\t\tif (status !== 200) {\n\t\t\t\tlet json: any;\n\n\t\t\t\tif (type != null && JSON_CONTENT_TYPE_RE.test(type)) {\n\t\t\t\t\t// it should be okay to swallow the parsing error here\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = await response.json();\n\t\t\t\t\t\tif (isXRPCErrorPayload(parsed)) {\n\t\t\t\t\t\t\tjson = parsed;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t} else {\n\t\t\t\t\tawait response.body?.cancel();\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tstatus: status,\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tdata: json ?? {\n\t\t\t\t\t\terror: `UnknownXRPCError`,\n\t\t\t\t\t\tmessage: `Request failed with status code ${status}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet data: any;\n\t\t\t\tswitch (format) {\n\t\t\t\t\tcase 'json': {\n\t\t\t\t\t\tif (type != null && JSON_CONTENT_TYPE_RE.test(type)) {\n\t\t\t\t\t\t\t// we shouldn't be handling parsing errors\n\t\t\t\t\t\t\tdata = await response.json();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait response.body?.cancel();\n\n\t\t\t\t\t\t\tthrow new TypeError(`Invalid response content-type (got ${type})`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase null: {\n\t\t\t\t\t\tdata = null;\n\n\t\t\t\t\t\tawait response.body?.cancel();\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'blob': {\n\t\t\t\t\t\tdata = await response.blob();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'bytes': {\n\t\t\t\t\t\tdata = new Uint8Array(await response.arrayBuffer());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'stream': {\n\t\t\t\t\t\tdata = response.body!;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t\tstatus: status,\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tdata: data,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n\n// #endregion\n\n// #region Utility functions\nconst _constructSearchParams = (params: Record<string, unknown> | undefined): string => {\n\tlet searchParams: URLSearchParams | undefined;\n\n\tfor (const key in params) {\n\t\tconst value = params[key];\n\n\t\tif (value !== undefined) {\n\t\t\tsearchParams ??= new URLSearchParams();\n\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (let idx = 0, len = value.length; idx < len; idx++) {\n\t\t\t\t\tconst val = value[idx];\n\t\t\t\t\tsearchParams.append(key, '' + val);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsearchParams.set(key, '' + value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn searchParams ? `?` + searchParams.toString() : '';\n};\n\nconst _constructProxyHeader = (proxy: ServiceProxyOptions | null | undefined): string | null => {\n\tif (proxy != null) {\n\t\treturn `${proxy.did}${proxy.serviceId}`;\n\t}\n\n\treturn null;\n};\n\nconst _mergeHeaders = (\n\tinit: HeadersInit | undefined,\n\tdefaults: Record<string, string | null>,\n): HeadersInit | undefined => {\n\tlet headers: Headers | undefined;\n\n\tfor (const name in defaults) {\n\t\tconst value = defaults[name];\n\n\t\tif (value !== null) {\n\t\t\theaders ??= new Headers(init);\n\n\t\t\tif (!headers.has(name)) {\n\t\t\t\theaders.set(name, value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn headers ?? init;\n};\n\nexport const isXRPCErrorPayload = (input: any): input is XRPCErrorPayload => {\n\tif (typeof input !== 'object' || input == null) {\n\t\treturn false;\n\t}\n\n\tconst kindType = typeof input.error;\n\tconst messageType = typeof input.message;\n\n\treturn kindType === 'string' && (messageType === 'undefined' || messageType === 'string');\n};\n// #endregion\n\n// #region Optimistic response helper\ntype ExtractSuccessData<R> = R extends { ok: true; data: infer D } ? D : never;\n\n/**\n * takes in the response returned by the client, and either returns the data if\n * it is a successful response, or throws if it's a failed response.\n * @param input either a ClientResponse, or a promise that resolves to a ClientResponse\n * @returns the data from a successful response\n *\n * @example\n * const data = await ok(client.get('com.atproto.server.describeServer'));\n * // ^? ComAtprotoServerDescribeServer.Output\n */\nexport const ok: {\n\t<T extends UnknownClientResponse>(promise: Promise<T>): Promise<ExtractSuccessData<T>>;\n\t<T extends UnknownClientResponse>(response: T): ExtractSuccessData<T>;\n} = (input: Promise<UnknownClientResponse> | UnknownClientResponse): any => {\n\tif (input instanceof Promise) {\n\t\treturn input.then(ok);\n\t}\n\n\tif (input.ok) {\n\t\treturn input.data;\n\t}\n\n\tthrow new ClientResponseError(input);\n};\n\n/** options when constructing a ClientResponseError */\nexport type ClientResponseErrorOptions = {\n\tstatus: number;\n\theaders?: Headers;\n\tdata: XRPCErrorPayload;\n};\n\n/** represents an error response returned by the client */\nexport class ClientResponseError extends Error {\n\t/** error name returned by service */\n\treadonly error: string;\n\t/** error message returned by service */\n\treadonly description?: string;\n\n\t/** response status */\n\treadonly status: number;\n\t/** response headers */\n\treadonly headers: Headers;\n\n\tconstructor({ status, headers = new Headers(), data }: ClientResponseErrorOptions) {\n\t\tsuper(`${data.error} > ${data.message ?? '(unspecified description)'}`);\n\n\t\tthis.name = 'ClientResponseError';\n\n\t\tthis.error = data.error;\n\t\tthis.description = data.message;\n\n\t\tthis.status = status;\n\t\tthis.headers = headers;\n\t}\n}\n\n/** represents a validation error during typed calls */\nexport class ClientValidationError extends Error {\n\t/** validation target (params, input, or output) */\n\treadonly target: 'params' | 'input' | 'output';\n\t/** validation result */\n\treadonly result: v.Err;\n\n\tconstructor(target: 'params' | 'input' | 'output', result: v.Err) {\n\t\tsuper(`validation failed for ${target}: ${result.message}`);\n\n\t\tthis.name = 'ClientValidationError';\n\t\tthis.target = target;\n\t\tthis.result = result;\n\t}\n}\n\n// #endregion\n","import { isUtf8LengthInRange } from '@atcute/uint8array';\nimport { isGraphemeLengthInRange } from '@atcute/util-text';\n\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport { _isBytesWrapper } from '../interfaces/bytes.ts';\nimport * as interfaces from '../interfaces/index.ts';\nimport * as syntax from '../syntax/index.ts';\nimport type { $type } from '../types/brand.ts';\nimport { assert } from '../utils.ts';\n\nimport { allowsEval, isArray, isObject, lazy, lazyProperty } from './utils.ts';\n\n/**\n * flag indicating whether xrpc schema generation helpers are used. set to true\n * when query() or procedure() is called. this enables conditional tree-shaking\n * of validation code when schemas are not used.\n * @deprecated internal flag for tree-shaking, do not use directly\n */\nexport let xrpcSchemaGenerated = false;\n\ntype Identity<T> = T;\ntype Flatten<T> = Identity<{ [K in keyof T]: T[K] }>;\n\ntype InputType =\n\t| 'unknown'\n\t| 'null'\n\t| 'undefined'\n\t| 'string'\n\t| 'integer'\n\t| 'boolean'\n\t| 'blob'\n\t| 'bytes'\n\t| 'cid-link'\n\t| 'object'\n\t| 'array';\n\ntype StringFormatMap = {\n\t'at-identifier': syntax.ActorIdentifier;\n\t'at-uri': syntax.ResourceUri;\n\tcid: syntax.Cid;\n\tdatetime: syntax.Datetime;\n\tdid: syntax.Did;\n\thandle: syntax.Handle;\n\tlanguage: syntax.LanguageCode;\n\tnsid: syntax.Nsid;\n\t'record-key': syntax.RecordKey;\n\ttid: syntax.Tid;\n\turi: syntax.GenericUri;\n};\n\nexport type StringFormat = keyof StringFormatMap;\n\ntype Literal = string | number | boolean;\ntype Key = string | number;\n\ntype IssueFormatter = () => string;\n\n// #region Schema issue types\nexport type IssueLeaf = { ok: false; msg: IssueFormatter } & (\n\t| { code: 'missing_value' }\n\t| { code: 'invalid_literal'; expected: readonly Literal[] }\n\t| { code: 'invalid_type'; expected: InputType }\n\t| { code: 'invalid_variant'; expected: string[] }\n\t| { code: 'invalid_integer_range'; min: number; max: number }\n\t| { code: 'invalid_string_format'; expected: StringFormat }\n\t| { code: 'invalid_string_graphemes'; minGraphemes: number; maxGraphemes: number }\n\t| { code: 'invalid_string_length'; minLength: number; maxLength: number }\n\t| { code: 'invalid_array_length'; minLength: number; maxLength: number }\n\t| { code: 'invalid_bytes_size'; minSize: number; maxSize: number }\n);\n\nexport type IssueTree =\n\t| IssueLeaf\n\t| { ok: false; code: 'prepend'; key: Key; tree: IssueTree }\n\t| { ok: false; code: 'join'; left: IssueTree; right: IssueTree };\n\nexport type Issue =\n\t| { code: 'missing_value'; path: Key[] }\n\t| { code: 'invalid_literal'; path: Key[]; expected: readonly Literal[] }\n\t| { code: 'invalid_type'; path: Key[]; expected: InputType }\n\t| { code: 'invalid_variant'; path: Key[]; expected: string[] }\n\t| { code: 'invalid_integer_range'; path: Key[]; min: number; max: number }\n\t| { code: 'invalid_string_format'; path: Key[]; expected: StringFormat }\n\t| { code: 'invalid_string_graphemes'; path: Key[]; minGraphemes: number; maxGraphemes: number }\n\t| { code: 'invalid_string_length'; path: Key[]; minLength: number; maxLength: number }\n\t| { code: 'invalid_array_length'; path: Key[]; minLength: number; maxLength: number }\n\t| { code: 'invalid_bytes_size'; path: Key[]; minSize: number; maxSize: number };\n\n// #__NO_SIDE_EFFECTS__\nconst joinIssues = (left: IssueTree | undefined, right: IssueTree): IssueTree => {\n\treturn left ? { ok: false, code: 'join', left, right } : right;\n};\n\n// #__NO_SIDE_EFFECTS__\nconst prependPath = (key: Key, tree: IssueTree): IssueTree => {\n\treturn { ok: false, code: 'prepend', key, tree };\n};\n\n// #region Schema result types\n\nexport type Ok<T> = {\n\tok: true;\n\tvalue: T;\n};\nexport type Err = {\n\tok: false;\n\treadonly message: string;\n\treadonly issues: readonly Issue[];\n\tthrow(): never;\n};\n\nexport type ValidationResult<T> = Ok<T> | Err;\n\n// #__NO_SIDE_EFFECTS__\nexport const ok = <T>(value: T): Ok<T> => {\n\treturn { ok: true, value };\n};\n\n// #region Base schema\n\n// Private symbols meant to hold types\ndeclare const kType: unique symbol;\ntype kType = typeof kType;\n\n// None set\nexport const FLAG_EMPTY = 0;\n// Don't continue validation if an error is encountered\nexport const FLAG_ABORT_EARLY = 1 << 0;\n\ntype MatcherResult = undefined | Ok<unknown> | IssueTree;\ntype Matcher = (input: unknown, flags: number) => MatcherResult;\n\ntype LexStandardSchemaResult<T extends BaseSchema> = StandardSchemaV1.Result<InferOutput<T>>;\n\ninterface LexStandardSchema<T extends BaseSchema> extends StandardSchemaV1.Props<unknown> {\n\treadonly validate: (value: unknown) => LexStandardSchemaResult<T> | Promise<LexStandardSchemaResult<T>>;\n\treadonly types?: StandardSchemaV1.Types<InferInput<T>, InferOutput<T>>;\n}\n\nexport interface BaseSchema<TInput = unknown, TOutput = TInput> {\n\treadonly kind: 'schema';\n\treadonly type: string;\n\treadonly '~run': Matcher;\n\treadonly '~standard': LexStandardSchema<this>;\n\n\treadonly [kType]?: { in: TInput; out: TOutput };\n}\n\nexport type InferInput<T extends BaseSchema> = NonNullable<T[kType]>['in'];\n\nexport type InferOutput<T extends BaseSchema> = NonNullable<T[kType]>['out'];\n\n// #region Schema runner\nconst cloneIssueWithPath = (issue: IssueLeaf, path: Key[]): Issue => {\n\tconst { ok: _ok, msg: _fmt, ...clone } = issue;\n\n\treturn { ...clone, path };\n};\n\nconst collectIssues = (tree: IssueTree, path: Key[] = [], issues: Issue[] = []): Issue[] => {\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcollectIssues(tree.left, path.slice(), issues);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath.push(tree.key);\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tissues.push(cloneIssueWithPath(tree, path));\n\t\t\t\treturn issues;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst countIssues = (tree: IssueTree): number => {\n\tlet count = 0;\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcount += countIssues(tree.left);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn count + 1;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst separatedList = (list: string[], sep: 'or' | 'and'): string => {\n\tswitch (list.length) {\n\t\tcase 0: {\n\t\t\treturn `nothing`;\n\t\t}\n\t\tcase 1: {\n\t\t\treturn list[0];\n\t\t}\n\t\tdefault: {\n\t\t\treturn `${list.slice(0, -1).join(', ')} ${sep} ${list[list.length - 1]}`;\n\t\t}\n\t}\n};\n\nconst formatLiteral = (value: Literal): string => {\n\treturn JSON.stringify(value);\n};\n\nconst formatRangeMessage = (\n\ttype: 'a string' | 'an array' | 'a byte array',\n\tunit: 'character' | 'grapheme' | 'item' | 'byte',\n\tmin: number,\n\tmax: number,\n): string => {\n\tlet message = `expected ${type} `;\n\n\tif (min > 0) {\n\t\tif (max === min) {\n\t\t\tmessage += `${min}`;\n\t\t} else if (max !== Infinity) {\n\t\t\tmessage += `between ${min} and ${max}`;\n\t\t} else {\n\t\t\tmessage += `at least ${min}`;\n\t\t}\n\t} else {\n\t\tmessage += `at most ${max}`;\n\t}\n\n\tmessage += ` ${unit}(s)`;\n\treturn message;\n};\n\nconst formatIssueTree = (tree: IssueTree): string => {\n\tlet path = '';\n\tlet count = 0;\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcount += countIssues(tree.right);\n\t\t\t\ttree = tree.left;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath += `.${tree.key}`;\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tconst message = tree.msg();\n\n\tlet msg = `${tree.code} at ${path || '.'} (${message})`;\n\tif (count > 0) {\n\t\tmsg += ` (+${count} other issue(s))`;\n\t}\n\n\treturn msg;\n};\n\nexport class ValidationError extends Error {\n\toverride readonly name = 'ValidationError';\n\n\t#issueTree: IssueTree;\n\n\tconstructor(issueTree: IssueTree) {\n\t\tsuper();\n\n\t\tthis.#issueTree = issueTree;\n\t}\n\n\toverride get message(): string {\n\t\treturn formatIssueTree(this.#issueTree);\n\t}\n\n\tget issues(): readonly Issue[] {\n\t\treturn collectIssues(this.#issueTree);\n\t}\n}\n\nclass ErrImpl implements Err {\n\treadonly ok = false;\n\n\t#issueTree: IssueTree;\n\n\tconstructor(issueTree: IssueTree) {\n\t\tthis.#issueTree = issueTree;\n\t}\n\n\tget message(): string {\n\t\treturn formatIssueTree(this.#issueTree);\n\t}\n\n\tget issues(): readonly Issue[] {\n\t\treturn collectIssues(this.#issueTree);\n\t}\n\n\tthrow(): never {\n\t\tthrow new ValidationError(this.#issueTree);\n\t}\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const is = <const TSchema extends BaseSchema>(\n\tschema: TSchema,\n\tinput: unknown,\n): input is InferInput<TSchema> => {\n\tconst r = schema['~run'](input, FLAG_ABORT_EARLY);\n\treturn r === undefined || r.ok;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const safeParse = <const TSchema extends BaseSchema>(\n\tschema: TSchema,\n\tinput: unknown,\n): ValidationResult<InferOutput<TSchema>> => {\n\tconst r = schema['~run'](input, FLAG_EMPTY);\n\n\tif (r === undefined) {\n\t\treturn ok(input as InferOutput<TSchema>);\n\t}\n\n\tif (r.ok) {\n\t\treturn r as Ok<InferOutput<TSchema>>;\n\t}\n\n\treturn new ErrImpl(r);\n};\n\nexport const parse = <const TSchema extends BaseSchema>(\n\tschema: TSchema,\n\tinput: unknown,\n): InferOutput<TSchema> => {\n\tconst r = schema['~run'](input, FLAG_EMPTY);\n\n\tif (r === undefined) {\n\t\treturn input as InferOutput<TSchema>;\n\t}\n\n\tif (r.ok) {\n\t\treturn r.value as InferOutput<TSchema>;\n\t}\n\n\tthrow new ValidationError(r);\n};\n\n// #region Standard Schema support\n\nconst collectStandardIssues = (\n\ttree: IssueTree,\n\tpath: Key[] = [],\n\tissues: StandardSchemaV1.Issue[] = [],\n): StandardSchemaV1.Issue[] => {\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcollectStandardIssues(tree.left, path.slice(), issues);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath.push(tree.key);\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tissues.push({ message: tree.msg(), path: path.length > 0 ? path : undefined });\n\t\t\t\treturn issues;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst toStandardSchema = <TSchema extends BaseSchema>(schema: TSchema): LexStandardSchema<TSchema> => {\n\treturn {\n\t\tversion: 1,\n\t\tvendor: '@atcute/lexicons',\n\t\tvalidate(value) {\n\t\t\tconst r = schema['~run'](value, FLAG_EMPTY);\n\n\t\t\tif (r === undefined) {\n\t\t\t\treturn { value: value as InferOutput<TSchema> };\n\t\t\t}\n\n\t\t\tif (r.ok) {\n\t\t\t\treturn { value: r.value as InferOutput<TSchema> };\n\t\t\t}\n\n\t\t\treturn { issues: collectStandardIssues(r) };\n\t\t},\n\t};\n};\n\n// #region Base constraint\n\nexport interface BaseConstraint<TType = unknown> {\n\treadonly kind: 'constraint';\n\treadonly type: string;\n\treadonly '~run': (input: TType, flags: number) => MatcherResult;\n}\n\ntype ConstraintTuple<T> = readonly [BaseConstraint<T>, ...BaseConstraint<T>[]];\n\nexport type SchemaWithConstraint<\n\tTItem extends BaseSchema,\n\tTConstraints extends ConstraintTuple<InferOutput<TItem>>,\n> = TItem & {\n\treadonly constraints: TConstraints;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const constrain = <\n\tTItem extends BaseSchema,\n\tconst TConstraints extends ConstraintTuple<InferOutput<TItem>>,\n>(\n\tbase: TItem,\n\tconstraints: TConstraints,\n): SchemaWithConstraint<TItem, TConstraints> => {\n\tconst len = constraints.length;\n\n\treturn {\n\t\t...base,\n\t\tconstraints: constraints,\n\t\t'~run'(input, flags) {\n\t\t\tlet result = base['~run'](input, flags);\n\t\t\tlet current: any;\n\n\t\t\tif (result === undefined) {\n\t\t\t\tcurrent = input;\n\t\t\t} else if (result.ok) {\n\t\t\t\tcurrent = result.value;\n\t\t\t} else {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tfor (let idx = 0; idx < len; idx++) {\n\t\t\t\tconst r = constraints[idx]['~run'](current, flags);\n\n\t\t\t\tif (r !== undefined) {\n\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\tcurrent = r.value;\n\n\t\t\t\t\t\tif (result === undefined || result.ok) {\n\t\t\t\t\t\t\tresult = r;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\treturn r;\n\t\t\t\t\t\t} else if (result === undefined || result.ok) {\n\t\t\t\t\t\t\tresult = r;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult = joinIssues(result, r);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t};\n};\n\n// #region Base metadata\n\nexport interface BaseMetadata {\n\treadonly kind: 'metadata';\n\treadonly type: string;\n}\n\n// #region Literal schema\n\nexport interface LiteralSchema<T extends Literal = Literal> extends BaseSchema<T> {\n\treadonly type: 'literal';\n\treadonly expected: T;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const literal = <T extends Literal>(value: T): LiteralSchema<T> => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_literal',\n\t\texpected: [value],\n\t\tmsg() {\n\t\t\treturn `expected ${formatLiteral(value)}`;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'literal',\n\t\texpected: value,\n\t\t'~run'(input, _flags) {\n\t\t\tif (input !== value) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\nexport interface LiteralEnumSchema<TEnums extends readonly Literal[] = []> extends BaseSchema<\n\tTEnums[number]\n> {\n\treadonly type: 'literal_enum';\n\treadonly expected: TEnums;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const literalEnum = <const TEnums extends readonly Literal[]>(\n\tvalues: TEnums,\n): LiteralEnumSchema<TEnums> => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_literal',\n\t\texpected: values,\n\t\tmsg() {\n\t\t\treturn `expected ${separatedList(values.map(formatLiteral), 'or')}`;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'literal_enum',\n\t\texpected: values,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!values.includes(input as any)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Boolean schema\n\nexport interface BooleanSchema extends BaseSchema<boolean> {\n\treadonly type: 'boolean';\n}\n\nconst ISSUE_TYPE_BOOLEAN: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'boolean',\n\tmsg() {\n\t\treturn `expected boolean`;\n\t},\n};\n\nconst BOOLEAN_SCHEMA: BooleanSchema = {\n\tkind: 'schema',\n\ttype: 'boolean',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'boolean') {\n\t\t\treturn ISSUE_TYPE_BOOLEAN;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const boolean = (): BooleanSchema => {\n\treturn BOOLEAN_SCHEMA;\n};\n\n// #region Integer schema\n\nexport interface IntegerSchema extends BaseSchema<number> {\n\treadonly type: 'integer';\n}\n\nconst ISSUE_TYPE_INTEGER: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'integer',\n\tmsg() {\n\t\treturn `expected integer`;\n\t},\n};\n\nconst INTEGER_SCHEMA: IntegerSchema = {\n\tkind: 'schema',\n\ttype: 'integer',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'number') {\n\t\t\treturn ISSUE_TYPE_INTEGER;\n\t\t}\n\n\t\tif (input < 0 || !Number.isSafeInteger(input)) {\n\t\t\treturn ISSUE_TYPE_INTEGER;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const integer = (): IntegerSchema => {\n\treturn INTEGER_SCHEMA;\n};\n\n// #region Integer constraints\n\nexport interface IntegerRangeConstraint<\n\tTMin extends number = number,\n\tTMax extends number = number,\n> extends BaseConstraint<number> {\n\treadonly type: 'integer_range';\n\treadonly min: TMin;\n\treadonly max: TMax;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const integerRange: {\n\t<const TMin extends number>(min: TMin): IntegerRangeConstraint<TMin>;\n\t<const TMin extends number, const TMax extends number>(\n\t\tmin: TMin,\n\t\tmax: TMax,\n\t): IntegerRangeConstraint<TMin, TMax>;\n} = (min: number, max: number = Infinity): IntegerRangeConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_integer_range',\n\t\tmin: min,\n\t\tmax: max,\n\t\tmsg() {\n\t\t\tlet message = `expected an integer `;\n\n\t\t\tif (min > 0) {\n\t\t\t\tif (max === min) {\n\t\t\t\t\tmessage += `of exactly ${min}`;\n\t\t\t\t} else if (max !== Infinity) {\n\t\t\t\t\tmessage += `between ${min} and ${max}`;\n\t\t\t\t} else {\n\t\t\t\t\tmessage += `of at least ${min}`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmessage += `of at most ${max}`;\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'integer_range',\n\t\tmin: min,\n\t\tmax: max,\n\t\t'~run'(input, _flags) {\n\t\t\tif (input < min) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (input > max) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region String schema\n\nexport interface StringSchema<T extends string = string> extends BaseSchema<T> {\n\treadonly type: 'string';\n\treadonly format: null;\n}\n\nexport interface FormattedStringSchema<\n\tTFormat extends keyof StringFormatMap = keyof StringFormatMap,\n> extends BaseSchema<StringFormatMap[TFormat]> {\n\treadonly type: 'string';\n\treadonly format: TFormat;\n}\n\nconst ISSUE_TYPE_STRING: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'string',\n\tmsg() {\n\t\treturn `expected string`;\n\t},\n};\n\nconst STRING_SINGLETON: StringSchema = {\n\tkind: 'schema',\n\ttype: 'string',\n\tformat: null,\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'string') {\n\t\t\treturn ISSUE_TYPE_STRING;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const string = <T extends string = string>(): StringSchema<T> => {\n\treturn STRING_SINGLETON as StringSchema<T>;\n};\n\n// #__NO_SIDE_EFFECTS__\nconst _formattedString = <TFormat extends keyof StringFormatMap>(\n\tformat: TFormat,\n\tvalidate: (input: string) => boolean,\n) => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_format',\n\t\texpected: format,\n\t\tmsg() {\n\t\t\treturn `expected a ${format} formatted string`;\n\t\t},\n\t};\n\n\tconst schema: FormattedStringSchema<TFormat> = {\n\t\tkind: 'schema',\n\t\ttype: 'string',\n\t\tformat: format,\n\t\t'~run'(input, _flags) {\n\t\t\tif (typeof input !== 'string') {\n\t\t\t\treturn ISSUE_TYPE_STRING;\n\t\t\t}\n\n\t\t\tif (!validate(input)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n\n\treturn () => schema;\n};\n\n// prettier-ignore\nexport const actorIdentifierString = /*#__PURE__*/ _formattedString('at-identifier', syntax.isActorIdentifier);\nexport const resourceUriString = /*#__PURE__*/ _formattedString('at-uri', syntax.isResourceUri);\nexport const cidString = /*#__PURE__*/ _formattedString('cid', syntax.isCid);\nexport const datetimeString = /*#__PURE__*/ _formattedString('datetime', syntax.isDatetime);\nexport const didString = /*#__PURE__*/ _formattedString('did', syntax.isDid);\nexport const handleString = /*#__PURE__*/ _formattedString('handle', syntax.isHandle);\nexport const languageCodeString = /*#__PURE__*/ _formattedString('language', syntax.isLanguageCode);\nexport const nsidString = /*#__PURE__*/ _formattedString('nsid', syntax.isNsid);\nexport const recordKeyString = /*#__PURE__*/ _formattedString('record-key', syntax.isRecordKey);\nexport const tidString = /*#__PURE__*/ _formattedString('tid', syntax.isTid);\nexport const genericUriString = /*#__PURE__*/ _formattedString('uri', syntax.isGenericUri);\n\n// #region String constraints\n\nexport interface StringLengthConstraint<\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n> extends BaseConstraint<string> {\n\treadonly type: 'string_length';\n\treadonly minLength: TMinLength;\n\treadonly maxLength: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const stringLength: {\n\t<const TMinLength extends number>(min: TMinLength): StringLengthConstraint<TMinLength>;\n\t<const TMinLength extends number, const TMaxLength extends number>(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): StringLengthConstraint<TMinLength, TMaxLength>;\n} = (minLength: number, maxLength: number = Infinity): StringLengthConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a string', 'character', minLength, maxLength);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'string_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!isUtf8LengthInRange(input, minLength, maxLength)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\nexport interface StringGraphemesConstraint<\n\tTMinGraphemes extends number = number,\n\tTMaxGraphemes extends number = number,\n> extends BaseConstraint<string> {\n\treadonly type: 'string_graphemes';\n\treadonly minGraphemes: TMinGraphemes;\n\treadonly maxGraphemes: TMaxGraphemes;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const stringGraphemes: {\n\t<const TMinGraphemes extends number>(min: TMinGraphemes): StringGraphemesConstraint<TMinGraphemes>;\n\t<const TMinGraphemes extends number, const TMaxGraphemes extends number>(\n\t\tmin: TMinGraphemes,\n\t\tmax: TMaxGraphemes,\n\t): StringGraphemesConstraint<TMinGraphemes, TMaxGraphemes>;\n} = (minGraphemes: number, maxGraphemes: number = Infinity): StringGraphemesConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_graphemes',\n\t\tminGraphemes: minGraphemes,\n\t\tmaxGraphemes: maxGraphemes,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a string', 'grapheme', minGraphemes, maxGraphemes);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'string_graphemes',\n\t\tminGraphemes: minGraphemes,\n\t\tmaxGraphemes: maxGraphemes,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!isGraphemeLengthInRange(input, minGraphemes, maxGraphemes)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region Blob schema\n\nexport interface BlobSchema extends BaseSchema<interfaces.Blob | interfaces.LegacyBlob, interfaces.Blob> {\n\treadonly type: 'blob';\n}\n\nconst ISSUE_EXPECTED_BLOB: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'blob',\n\tmsg() {\n\t\treturn `expected blob`;\n\t},\n};\n\nconst BLOB_SCHEMA: BlobSchema = {\n\tkind: 'schema',\n\ttype: 'blob',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn ISSUE_EXPECTED_BLOB;\n\t\t}\n\n\t\tif (interfaces.isBlob(input)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (interfaces.isLegacyBlob(input)) {\n\t\t\tconst blob: interfaces.Blob = {\n\t\t\t\t$type: 'blob',\n\t\t\t\tmimeType: input.mimeType,\n\t\t\t\tref: { $link: input.cid },\n\t\t\t\tsize: -1,\n\t\t\t};\n\n\t\t\treturn ok(blob);\n\t\t}\n\n\t\treturn ISSUE_EXPECTED_BLOB;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const blob = (): BlobSchema => {\n\treturn BLOB_SCHEMA;\n};\n\n// #region IPLD bytes schema\n\nexport interface BytesSchema extends BaseSchema<interfaces.Bytes, interfaces.Bytes> {\n\treadonly type: 'bytes';\n}\n\nconst ISSUE_EXPECTED_BYTES: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'bytes',\n\tmsg() {\n\t\treturn `expected bytes`;\n\t},\n};\n\nconst BYTES_SCHEMA: BytesSchema = {\n\tkind: 'schema',\n\ttype: 'bytes',\n\t'~run'(input, _flags) {\n\t\tif (!interfaces.isBytes(input)) {\n\t\t\treturn ISSUE_EXPECTED_BYTES;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const bytes = (): BytesSchema => {\n\treturn BYTES_SCHEMA;\n};\n\n// #region IPLD bytes constraint\nexport interface BytesSizeConstraint<\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n> extends BaseConstraint<interfaces.Bytes> {\n\treadonly type: 'bytes_size';\n\treadonly minSize: TMinLength;\n\treadonly maxSize: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const bytesSize: {\n\t<const TMinLength extends number>(min: TMinLength): BytesSizeConstraint<TMinLength>;\n\t<const TMinLength extends number, const TMaxLength extends number>(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): BytesSizeConstraint<TMinLength, TMaxLength>;\n} = (minSize: number, maxSize: number = Infinity): BytesSizeConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_bytes_size',\n\t\tminSize: minSize,\n\t\tmaxSize: maxSize,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a byte array', 'byte', minSize, maxSize);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'bytes_size',\n\t\tminSize: minSize,\n\t\tmaxSize: maxSize,\n\t\t'~run'(input, _flags) {\n\t\t\tlet size: number;\n\n\t\t\tif (_isBytesWrapper(input)) {\n\t\t\t\tsize = input.buf.length;\n\t\t\t} else {\n\t\t\t\tconst str = input.$bytes;\n\t\t\t\tlet bytes = str.length;\n\n\t\t\t\tif (str.charCodeAt(bytes - 1) === 0x3d) {\n\t\t\t\t\tbytes--;\n\t\t\t\t}\n\t\t\t\tif (bytes > 1 && str.charCodeAt(bytes - 1) === 0x3d) {\n\t\t\t\t\tbytes--;\n\t\t\t\t}\n\n\t\t\t\tsize = (bytes * 3) >>> 2;\n\t\t\t}\n\n\t\t\tif (size < minSize) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (size > maxSize) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region IPLD CID type schema\n\nexport interface CidLinkSchema extends BaseSchema<interfaces.CidLink, interfaces.CidLink> {\n\treadonly type: 'cid_link';\n}\n\nconst ISSUE_EXPECTED_CID_LINK: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'cid-link',\n\tmsg() {\n\t\treturn `expected cid-link`;\n\t},\n};\n\nconst CID_LINK_SCHEMA: CidLinkSchema = {\n\tkind: 'schema',\n\ttype: 'cid_link',\n\t'~run'(input, _flags) {\n\t\tif (!interfaces.isCidLink(input)) {\n\t\t\treturn ISSUE_EXPECTED_CID_LINK;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const cidLink = (): CidLinkSchema => {\n\treturn CID_LINK_SCHEMA;\n};\n\n// #region Nullable schema\n\nexport interface NullableSchema<TItem extends BaseSchema = BaseSchema> extends BaseSchema<\n\tInferInput<TItem> | null,\n\tInferOutput<TItem> | null\n> {\n\treadonly type: 'nullable';\n\treadonly wrapped: TItem;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const nullable = <TItem extends BaseSchema>(wrapped: TItem): NullableSchema<TItem> => {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'nullable',\n\t\twrapped: wrapped,\n\t\t'~run'(input, flags) {\n\t\t\tif (input === null) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn wrapped['~run'](input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Optional schema\n\nexport type DefaultValue<TItem extends BaseSchema> =\n\t| InferOutput<TItem>\n\t| (() => InferOutput<TItem>)\n\t| undefined;\n\nexport type InferOptionalOutput<\n\tTItem extends BaseSchema,\n\tTDefault extends DefaultValue<TItem>,\n> = undefined extends TDefault ? InferOutput<TItem> | undefined : InferOutput<TItem>;\n\nexport interface OptionalSchema<\n\tTItem extends BaseSchema = BaseSchema,\n\tTDefault extends DefaultValue<TItem> = DefaultValue<TItem>,\n> extends BaseSchema<InferInput<TItem> | undefined, InferOptionalOutput<TItem, TDefault>> {\n\treadonly type: 'optional';\n\treadonly wrapped: TItem;\n\treadonly default: TDefault;\n}\n\ntype MaybeOptional<TItem extends BaseSchema> = TItem | OptionalSchema<TItem, undefined>;\n\n// #__NO_SIDE_EFFECTS__\nexport const optional: {\n\t<TItem extends BaseSchema>(wrapped: TItem): OptionalSchema<TItem, undefined>;\n\t<TItem extends BaseSchema, TDefault extends DefaultValue<TItem>>(\n\t\twrapped: TItem,\n\t\tdefaultValue: TDefault,\n\t): OptionalSchema<TItem, TDefault>;\n} = (wrapped: BaseSchema, defaultValue?: any): OptionalSchema<any, any> => {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'optional',\n\t\twrapped: wrapped,\n\t\tdefault: defaultValue,\n\t\t'~run'(input, flags) {\n\t\t\tif (input === undefined) {\n\t\t\t\tif (defaultValue === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst value = typeof defaultValue === 'function' ? defaultValue() : defaultValue;\n\n\t\t\t\treturn ok(value);\n\t\t\t}\n\n\t\t\treturn wrapped['~run'](input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\nconst isOptionalSchema = (schema: BaseSchema): schema is OptionalSchema<any, unknown> => {\n\treturn schema.type === 'optional';\n};\n\n// #region Array schema\n\nexport interface ArraySchema<TItem extends BaseSchema = BaseSchema> extends BaseSchema<unknown[], unknown[]> {\n\treadonly type: 'array';\n\treadonly item: TItem;\n\n\treadonly [kType]?: { in: InferInput<TItem>[]; out: InferOutput<TItem>[] };\n}\n\nconst ISSUE_TYPE_ARRAY: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'array',\n\tmsg() {\n\t\treturn `expected array`;\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const array = <TItem extends BaseSchema>(item: TItem | (() => TItem)): ArraySchema<TItem> => {\n\tconst resolvedShape = lazy(() => {\n\t\treturn typeof item === 'function' ? item() : item;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'array',\n\t\tget item() {\n\t\t\treturn lazyProperty(this, 'item', resolvedShape.value);\n\t\t},\n\t\tget '~run'() {\n\t\t\tconst shape = resolvedShape.value;\n\n\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\tif (!isArray(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_ARRAY;\n\t\t\t\t}\n\n\t\t\t\tlet issues: IssueTree | undefined;\n\t\t\t\tlet output: any[] | undefined;\n\n\t\t\t\tfor (let idx = 0, len = input.length; idx < len; idx++) {\n\t\t\t\t\tconst val = input[idx];\n\t\t\t\t\tconst r = shape['~run'](val, flags);\n\n\t\t\t\t\tif (r !== undefined) {\n\t\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\t\tif (output === undefined) {\n\t\t\t\t\t\t\t\toutput = input.slice();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput[idx] = r.value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tissues = joinIssues(issues, prependPath(idx, r));\n\n\t\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (issues !== undefined) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\tif (output !== undefined) {\n\t\t\t\t\treturn ok(output);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Array constraints\n\nexport interface ArrayLengthConstraint<\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n> extends BaseConstraint<unknown[]> {\n\treadonly type: 'array_length';\n\treadonly minLength: TMinLength;\n\treadonly maxLength: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const arrayLength: {\n\t<const TMinLength extends number>(min: TMinLength): ArrayLengthConstraint<TMinLength>;\n\t<const TMinLength extends number, const TMaxLength extends number>(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): ArrayLengthConstraint<TMinLength, TMaxLength>;\n} = (minLength: number, maxLength: number = Infinity): ArrayLengthConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_array_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('an array', 'item', minLength, maxLength);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'array_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\t'~run'(input, _flags) {\n\t\t\tconst length = input.length;\n\n\t\t\tif (length < minLength) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (length > maxLength) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region Object schema\n\n// `ObjectSchema` accepts a `LooseObjectShape` instead of `ObjectShape` to allow\n// for circular references, and this means preventing TypeScript from attempting\n// to eagerly evaluate the shape, unfortunate that this means we can't throw a\n// type issue if you add a non-schema value into the shape though\n\nexport type LooseObjectShape = Record<string, any>;\nexport type ObjectShape = Record<string, BaseSchema>;\n\nexport type OptionalObjectInputKeys<TShape extends ObjectShape> = {\n\t[Key in keyof TShape]: TShape[Key] extends OptionalSchema<any, any> ? Key : never;\n}[keyof TShape];\n\nexport type OptionalObjectOutputKeys<TShape extends ObjectShape> = {\n\t[Key in keyof TShape]: TShape[Key] extends OptionalSchema<any, infer Default>\n\t\t? undefined extends Default\n\t\t\t? Key\n\t\t\t: never\n\t\t: never;\n}[keyof TShape];\n\ntype InferObjectInput<TShape extends ObjectShape> = Flatten<\n\t{\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectInputKeys<TShape> ? never : Key]: InferInput<\n\t\t\tTShape[Key]\n\t\t>;\n\t} & {\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectInputKeys<TShape> ? Key : never]?: InferInput<\n\t\t\tTShape[Key]\n\t\t>;\n\t}\n>;\n\ntype InferObjectOutput<TShape extends ObjectShape> = Flatten<\n\t{\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectOutputKeys<TShape>\n\t\t\t? never\n\t\t\t: Key]: InferOutput<TShape[Key]>;\n\t} & {\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectOutputKeys<TShape>\n\t\t\t? Key\n\t\t\t: never]?: InferOutput<TShape[Key]>;\n\t}\n>;\n\nexport interface ObjectSchema<TShape extends LooseObjectShape = LooseObjectShape> extends BaseSchema<\n\tRecord<string, unknown>\n> {\n\treadonly type: 'object';\n\treadonly shape: Readonly<TShape>;\n\n\t// passing `InferObjectX` into `extends BaseSchema<...>` eagerly evaluates the\n\t// shape, however, passing it as a property means that it's only evaluated if\n\t// you attempt to grab the value.\n\treadonly [kType]?: { in: InferObjectInput<TShape>; out: InferObjectOutput<TShape> };\n}\n\ninterface ObjectEntry {\n\tkey: string;\n\tschema: BaseSchema;\n\toptional: boolean;\n\tmissing: IssueTree;\n}\n\nconst ISSUE_TYPE_OBJECT: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'object',\n\tmsg() {\n\t\treturn `expected object`;\n\t},\n};\n\nconst ISSUE_MISSING: IssueLeaf = {\n\tok: false,\n\tcode: 'missing_value',\n\tmsg() {\n\t\treturn `missing value`;\n\t},\n};\n\nconst set = (obj: Record<string, unknown>, key: string, value: unknown): void => {\n\tif (key === '__proto__') {\n\t\tObject.defineProperty(obj, key, { value });\n\t} else {\n\t\tobj[key] = value;\n\t}\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const object = <TShape extends LooseObjectShape>(shape: TShape): ObjectSchema<TShape> => {\n\tconst resolvedEntries = lazy(() => {\n\t\tconst resolved: ObjectEntry[] = [];\n\n\t\tfor (const key in shape) {\n\t\t\tconst schema = shape[key];\n\n\t\t\tresolved.push({\n\t\t\t\tkey: key,\n\t\t\t\tschema: schema,\n\t\t\t\toptional: isOptionalSchema(schema),\n\t\t\t\tmissing: prependPath(key, ISSUE_MISSING),\n\t\t\t});\n\t\t}\n\n\t\treturn resolved;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'object',\n\t\tget shape() {\n\t\t\t// if we just return the shape as is then it wouldn't be the same exact\n\t\t\t// shape when getters are present.\n\t\t\tconst resolved = resolvedEntries.value;\n\t\t\tconst obj: any = {};\n\n\t\t\tfor (const entry of resolved) {\n\t\t\t\tobj[entry.key] = entry.schema;\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'shape', obj as TShape);\n\t\t},\n\t\tget '~run'() {\n\t\t\tconst shape = resolvedEntries.value;\n\t\t\tconst len = shape.length;\n\n\t\t\tconst generateFastpass = (): Matcher => {\n\t\t\t\tconst fields: [string, any][] = [\n\t\t\t\t\t['$ok', ok],\n\t\t\t\t\t['$joinIssues', joinIssues],\n\t\t\t\t\t['$prependPath', prependPath],\n\t\t\t\t];\n\n\t\t\t\tlet doc = `let $iss,$out;`;\n\n\t\t\t\tfor (let idx = 0; idx < len; idx++) {\n\t\t\t\t\tconst entry = shape[idx];\n\n\t\t\t\t\tconst key = entry.key;\n\t\t\t\t\tconst esckey = JSON.stringify(key);\n\n\t\t\t\t\tconst id = `_${idx}`;\n\n\t\t\t\t\tdoc += `{const $val=$in[${esckey}];`;\n\n\t\t\t\t\tif (entry.optional) {\n\t\t\t\t\t\tdoc += `if($val!==undefined){`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdoc += `if($val!==undefined||${esckey} in $in){`;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoc += `const $res=${id}$schema[\"~run\"]($val,$flags);if($res!==undefined)if($res.ok)${key !== '__proto__' ? `($out??={...$in})[${esckey}]=$res.value` : `Object.defineProperty($out??={...$in},${esckey},{value:$res.value})`};else if((($iss=$joinIssues($iss,$prependPath(${esckey},$res))),$flags&${FLAG_ABORT_EARLY}))return $iss;}`;\n\n\t\t\t\t\tif (entry.optional) {\n\t\t\t\t\t\tconst schema = entry.schema as OptionalSchema;\n\t\t\t\t\t\tconst innerSchema = schema.wrapped;\n\t\t\t\t\t\tconst defaultValue = schema.default;\n\n\t\t\t\t\t\tfields.push([`${id}$schema`, innerSchema]);\n\n\t\t\t\t\t\tif (defaultValue !== undefined) {\n\t\t\t\t\t\t\tconst calls = typeof defaultValue === 'function' ? `${id}$default()` : `${id}$default`;\n\n\t\t\t\t\t\t\tfields.push([`${id}$default`, defaultValue]);\n\n\t\t\t\t\t\t\tdoc +=\n\t\t\t\t\t\t\t\tkey !== '__proto__'\n\t\t\t\t\t\t\t\t\t? `else($out??={...$in})[${esckey}]=${calls};`\n\t\t\t\t\t\t\t\t\t: `else Object.defineProperty($out??={...$in},${esckey},{value:${calls}});`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfields.push([`${id}$schema`, entry.schema]);\n\t\t\t\t\t\tfields.push([`${id}$missing`, entry.missing]);\n\n\t\t\t\t\t\tdoc += `else if((($iss=$joinIssues($iss,${id}$missing)),$flags&${FLAG_ABORT_EARLY}))return $iss;`;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoc += `}`;\n\t\t\t\t}\n\n\t\t\t\tdoc += `if($iss!==undefined)return $iss;if($out!==undefined)return $ok($out);`;\n\n\t\t\t\tconst fn = new Function(\n\t\t\t\t\t`[${fields.map(([id]) => id).join(',')}]`,\n\t\t\t\t\t`return function matcher($in,$flags){${doc}}`,\n\t\t\t\t);\n\n\t\t\t\treturn fn(fields.map(([, field]) => field));\n\t\t\t};\n\n\t\t\tif (allowsEval.value) {\n\t\t\t\tconst fastpass = generateFastpass();\n\n\t\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn fastpass(input, flags);\n\t\t\t\t};\n\n\t\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t\t}\n\n\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t}\n\n\t\t\t\tlet issues: IssueTree | undefined;\n\t\t\t\tlet output: Record<string, unknown> | undefined;\n\n\t\t\t\tfor (let idx = 0; idx < len; idx++) {\n\t\t\t\t\tconst entry = shape[idx];\n\n\t\t\t\t\tconst key = entry.key;\n\t\t\t\t\tconst value = input[key];\n\n\t\t\t\t\tif (!entry.optional && value === undefined && !(key in input)) {\n\t\t\t\t\t\tissues = joinIssues(issues, entry.missing);\n\n\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst r = entry.schema['~run'](value, flags);\n\n\t\t\t\t\tif (r !== undefined) {\n\t\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\t\tif (output === undefined) {\n\t\t\t\t\t\t\t\toutput = { ...input };\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/*#__INLINE__*/ set(output, key, r.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tissues = joinIssues(issues, prependPath(key, r));\n\n\t\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (issues !== undefined) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\tif (output !== undefined) {\n\t\t\t\t\treturn ok(output);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Record schema\n//\n// unfortunately, adapting for circular references has meant that we can't have\n// TypeScript check the object against a particular shape ($type field required)\n\nexport type RecordObjectShape = {\n\t$type: LiteralSchema<syntax.Nsid>;\n\t[key: string]: BaseSchema;\n};\n\nexport type RecordKeySchema = StringSchema | FormattedStringSchema | LiteralSchema<string>;\nexport type RecordObjectSchema = ObjectSchema<RecordObjectShape>;\n\nexport interface RecordSchema<TObject extends ObjectSchema, TKey extends RecordKeySchema> extends BaseSchema<\n\tRecord<string, unknown>\n> {\n\treadonly type: 'record';\n\treadonly key: TKey;\n\treadonly object: TObject;\n\n\treadonly [kType]?: { in: InferInput<TObject>; out: InferOutput<TObject> };\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const record = <TKey extends RecordKeySchema, TObject extends ObjectSchema>(\n\tkey: TKey,\n\tobject: TObject,\n): RecordSchema<TObject, TKey> => {\n\tconst validatedObject = lazy((): TObject => {\n\t\tconst shape = object.shape;\n\n\t\tlet t = shape.$type as MaybeOptional<LiteralSchema<syntax.Nsid>> | undefined;\n\n\t\tassert(t !== undefined, `expected $type in record to be defined`);\n\t\tif (t.type === 'optional') {\n\t\t\tt = t.wrapped;\n\t\t}\n\n\t\tassert(t.type === 'literal' && typeof t.expected === 'string', `expected $type to be a string literal`);\n\n\t\treturn object;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'record',\n\t\tkey: key,\n\t\tget object() {\n\t\t\treturn lazyProperty(this, 'object', validatedObject.value);\n\t\t},\n\t\t'~run'(input, flags) {\n\t\t\treturn lazyProperty(this, '~run', validatedObject.value['~run'])(input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Variant schema\n\ntype VariantTuple = readonly ObjectSchema<any>[];\n\ntype InferVariantInput<TMembers extends VariantTuple> = $type.enforce<InferInput<TMembers[number]>>;\n\ntype InferVariantOutput<TMembers extends VariantTuple> = $type.enforce<InferOutput<TMembers[number]>>;\n\nexport interface VariantSchema<\n\tTMembers extends VariantTuple = VariantTuple,\n\tTClosed extends boolean = boolean,\n> extends BaseSchema<Record<string, unknown>> {\n\treadonly type: 'variant';\n\treadonly members: TMembers;\n\treadonly closed: TClosed;\n\n\treadonly [kType]?: { in: InferVariantInput<TMembers>; out: InferVariantOutput<TMembers> };\n}\n\nconst ISSUE_VARIANT_MISSING = /*#__PURE__*/ prependPath('$type', ISSUE_MISSING);\n\nconst ISSUE_VARIANT_TYPE = /*#__PURE__*/ prependPath('$type', ISSUE_TYPE_STRING);\n\n// #__NO_SIDE_EFFECTS__\nexport const variant: {\n\t<const TMembers extends VariantTuple>(members: TMembers): VariantSchema<TMembers>;\n\t<const TMembers extends VariantTuple, TClosed extends boolean>(\n\t\tmembers: TMembers,\n\t\tclosed: TClosed,\n\t): VariantSchema<TMembers, TClosed>;\n} = (members: ObjectSchema[], closed: boolean = false): VariantSchema<any, any> => {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'variant',\n\t\tmembers: members,\n\t\tclosed: closed,\n\t\tget '~run'() {\n\t\t\tconst types: string[] = [];\n\t\t\tconst schemas: ObjectSchema[] = [];\n\n\t\t\tfor (let idx = 0, len = members.length; idx < len; idx++) {\n\t\t\t\tconst member = members[idx]!;\n\t\t\t\tconst shape = member.shape;\n\n\t\t\t\tlet t = shape.$type as MaybeOptional<LiteralSchema<syntax.Nsid>> | undefined;\n\n\t\t\t\tassert(t !== undefined, `expected $type in variant member #${idx} to be defined`);\n\t\t\t\tif (t.type === 'optional') {\n\t\t\t\t\tt = t.wrapped;\n\t\t\t\t}\n\n\t\t\t\tassert(\n\t\t\t\t\tt.type === 'literal' && typeof t.expected === 'string',\n\t\t\t\t\t`expected $type in variant member #${idx} to be a string literal`,\n\t\t\t\t);\n\n\t\t\t\ttypes.push(t.expected);\n\t\t\t\tschemas.push(member);\n\t\t\t}\n\n\t\t\tconst issue: IssueLeaf = {\n\t\t\t\tok: false,\n\t\t\t\tcode: 'invalid_variant',\n\t\t\t\texpected: types,\n\t\t\t\tmsg() {\n\t\t\t\t\treturn `expected ${separatedList(types, 'or')}`;\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t}\n\n\t\t\t\tconst type = input.$type;\n\n\t\t\t\tif (type === undefined && !('$type' in input)) {\n\t\t\t\t\treturn ISSUE_VARIANT_MISSING;\n\t\t\t\t}\n\n\t\t\t\tif (typeof type !== 'string') {\n\t\t\t\t\treturn closed ? issue : ISSUE_VARIANT_TYPE;\n\t\t\t\t}\n\n\t\t\t\tfor (let idx = 0, len = types.length; idx < len; idx++) {\n\t\t\t\t\tif (types[idx] === type) {\n\t\t\t\t\t\treturn schemas[idx]!['~run'](input, flags);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (closed) {\n\t\t\t\t\treturn issue;\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Unknown schema\n\nexport interface UnknownSchema extends BaseSchema<Record<string, unknown>> {\n\treadonly type: 'unknown';\n}\n\nconst ISSUE_TYPE_UNKNOWN: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'unknown',\n\tmsg() {\n\t\treturn `expected unknown`;\n\t},\n};\n\nconst UNKNOWN_SCHEMA: UnknownSchema = {\n\tkind: 'schema',\n\ttype: 'unknown',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn ISSUE_TYPE_UNKNOWN;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const unknown = (): UnknownSchema => {\n\treturn UNKNOWN_SCHEMA;\n};\n\n// #region XRPC types\n\nexport interface XRPCLexBodyParam<\n\tTSchema extends ObjectSchema | VariantSchema = ObjectSchema | VariantSchema,\n> {\n\treadonly type: 'lex';\n\treadonly schema: TSchema;\n}\n\nexport interface XRPCBlobBodyParam {\n\treadonly type: 'blob';\n\treadonly encoding?: string[];\n}\n\nexport type XRPCBodyParam = XRPCLexBodyParam | XRPCBlobBodyParam | null;\n\nexport type InferXRPCBodyInput<T extends XRPCBodyParam> =\n\tT extends XRPCLexBodyParam<infer Schema>\n\t\t? InferInput<Schema>\n\t\t: T extends XRPCBlobBodyParam\n\t\t\t? Blob\n\t\t\t: T extends null\n\t\t\t\t? void\n\t\t\t\t: never;\n\nexport type InferXRPCBodyOutput<T extends XRPCBodyParam> =\n\tT extends XRPCLexBodyParam<infer Schema>\n\t\t? InferOutput<Schema>\n\t\t: T extends XRPCBlobBodyParam\n\t\t\t? Blob\n\t\t\t: T extends null\n\t\t\t\t? void\n\t\t\t\t: never;\n\n// #region XRPC procedure metadata\n\nexport interface XRPCProcedureMetadata<\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTInput extends XRPCBodyParam = XRPCBodyParam,\n\tTOutput extends XRPCBodyParam = XRPCBodyParam,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n> extends BaseMetadata {\n\treadonly type: 'xrpc_procedure';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly input: TInput;\n\treadonly output: TOutput;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const procedure = <\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTInput extends XRPCBodyParam,\n\tTOutput extends XRPCBodyParam,\n>(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\tinput: TInput;\n\t\toutput: TOutput;\n\t},\n): XRPCProcedureMetadata<TParams, TInput, TOutput, TNsid> => {\n\t// `schema` can be a getter, and we'd have to resolve that getter.\n\n\txrpcSchemaGenerated = true;\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_procedure',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget input() {\n\t\t\tlet val = options.input;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TInput;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'input', val);\n\t\t},\n\t\tget output() {\n\t\t\tlet val = options.output;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TOutput;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'output', val);\n\t\t},\n\t};\n};\n\n// #region XRPC query metadata\n\nexport interface XRPCQueryMetadata<\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTOutput extends XRPCBodyParam = XRPCBodyParam,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n> extends BaseMetadata {\n\treadonly type: 'xrpc_query';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly output: TOutput;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const query = <\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTOutput extends XRPCBodyParam,\n>(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\toutput: TOutput;\n\t},\n): XRPCQueryMetadata<TParams, TOutput, TNsid> => {\n\t// `schema` can be a getter, and we'd have to resolve that getter.\n\n\txrpcSchemaGenerated = true;\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_query',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget output() {\n\t\t\tlet val = options.output;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TOutput;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'output', val);\n\t\t},\n\t};\n};\n\n// #region XRPC subscription metadata\n\nexport interface XRPCSubscriptionMetadata<\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTMessage extends ObjectSchema<any> | VariantSchema<any, any> | null =\n\t\t| ObjectSchema<any>\n\t\t| VariantSchema<any, any>\n\t\t| null,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n> extends BaseMetadata {\n\treadonly type: 'xrpc_subscription';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly message: TMessage;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const subscription = <\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTMessage extends ObjectSchema<any> | VariantSchema<any, any> | null,\n>(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\treadonly message: TMessage;\n\t},\n): XRPCSubscriptionMetadata<TParams, TMessage, TNsid> => {\n\t// `message` can be a getter, and we'd have to resolve that getter.\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_subscription',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget message() {\n\t\t\treturn lazyProperty(this, 'message', options.message);\n\t\t},\n\t};\n};\n","const segmenter = new Intl.Segmenter();\n\nconst isAsciiWithoutCr = (text: string): boolean => {\n\tconst len = text.length;\n\tlet idx = 0;\n\n\twhile (idx + 3 < len) {\n\t\tconst a = text.charCodeAt(idx);\n\t\tconst b = text.charCodeAt(idx + 1);\n\t\tconst c = text.charCodeAt(idx + 2);\n\t\tconst d = text.charCodeAt(idx + 3);\n\n\t\tif ((a | b | c | d) > 0x7f || a === 0x0d || b === 0x0d || c === 0x0d || d === 0x0d) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx += 4;\n\t}\n\n\twhile (idx < len) {\n\t\tconst code = text.charCodeAt(idx);\n\t\tif (code > 0x7f || code === 0x0d) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx++;\n\t}\n\n\treturn true;\n};\n\n/**\n * returns the grapheme length of a string\n * @param text string to count graphemes in\n * @returns grapheme count\n */\nexport const getGraphemeLength = (text: string): number => {\n\tif (isAsciiWithoutCr(text)) {\n\t\treturn text.length;\n\t}\n\n\tconst iterator = segmenter.segment(text)[Symbol.iterator]();\n\tlet count = 0;\n\n\twhile (!iterator.next().done) {\n\t\tcount++;\n\t}\n\n\treturn count;\n};\n\n/**\n * checks if the grapheme length of a string is within the specified range\n * @param text string to check\n * @param min minimum grapheme length (inclusive)\n * @param max maximum grapheme length (inclusive)\n * @returns true if the grapheme length is within range\n */\nexport const isGraphemeLengthInRange = (text: string, min: number, max: number): boolean => {\n\tconst utf16Len = text.length;\n\n\t// UTF-16 length < min means grapheme count < min\n\tif (utf16Len < min) {\n\t\treturn false;\n\t}\n\n\t// if there's no minimum constraint and UTF-16 length is within max,\n\t// grapheme count is definitely within max\n\tif (min === 0 && utf16Len <= max) {\n\t\treturn true;\n\t}\n\n\tif (isAsciiWithoutCr(text)) {\n\t\treturn utf16Len <= max;\n\t}\n\n\t// count graphemes with early termination\n\tconst iterator = segmenter.segment(text)[Symbol.iterator]();\n\tlet count = 0;\n\n\twhile (!iterator.next().done) {\n\t\tcount++;\n\t\tif (count > max) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn count >= min;\n};\n","/**\n * represents an object containing raw binary data encoded as a base64 string\n */\nexport interface Bytes {\n\t$bytes: string;\n}\n\nconst BYTES_SYMBOL = Symbol.for('@atcute/bytes-wrapper');\n\n/**\n * this should match with {@link file://./../../../../utilities/cbor/lib/bytes.ts}\n * @internal\n */\nexport interface _BytesWrapper {\n\treadonly [BYTES_SYMBOL]: true;\n\n\treadonly buf: Uint8Array;\n\treadonly $bytes: string;\n\n\ttoJSON(): Bytes;\n}\n\n/**\n * @internal\n */\n// #__NO_SIDE_EFFECTS__\nexport const _isBytesWrapper = (input: unknown): input is _BytesWrapper => {\n\treturn typeof input === 'object' && input !== null && BYTES_SYMBOL in input;\n};\n\nconst BASE64_RE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}(?:==)?|[A-Za-z0-9+/]{3}=?)?$/;\nconst isBase64 = (input: unknown): input is string => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\treturn BASE64_RE.test(input);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isBytes = (input: unknown): input is Bytes => {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' &&\n\t\tv !== null &&\n\t\t(BYTES_SYMBOL in v || (isBase64(v.$bytes) && Object.keys(v).length === 1))\n\t);\n};\n","export { isBlob, isLegacyBlob, type Blob, type LegacyBlob } from './blob.ts';\nexport { isBytes, type Bytes } from './bytes.ts';\nexport { isCidLink, type CidLink } from './cid-link.ts';\n","import type { Cid } from '../syntax/cid.ts';\n\nimport { isCidLink, type CidLink } from './cid-link.ts';\n\n/**\n * represents a reference to a data blob\n */\nexport interface Blob<TMime extends string = string> {\n\t$type: 'blob';\n\tmimeType: TMime;\n\tref: CidLink;\n\tsize: number;\n}\n\nexport const isBlob = (input: unknown): input is Blob => {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' &&\n\t\tv !== null &&\n\t\tv.$type === 'blob' &&\n\t\ttypeof v.mimeType === 'string' &&\n\t\tNumber.isSafeInteger(v.size) &&\n\t\tisCidLink(v.ref) &&\n\t\tObject.keys(v).length === 4\n\t);\n};\n\n/**\n * deprecated interface representing an interface to a data blob\n */\nexport interface LegacyBlob<TMime extends string = string> {\n\tcid: Cid;\n\tmimeType: TMime;\n}\n\nexport const isLegacyBlob = (input: unknown): input is LegacyBlob => {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' &&\n\t\tv !== null &&\n\t\ttypeof v.cid === 'string' &&\n\t\ttypeof v.mimeType === 'string' &&\n\t\tObject.keys(v).length === 2\n\t);\n};\n","import { isCid, type Cid } from '../syntax/cid.ts';\n\n/**\n * represents a content identifier (CID) reference\n */\nexport interface CidLink {\n\t$link: Cid;\n}\n\nconst CID_LINK_SYMBOL = Symbol.for('@atcute/cid-link-wrapper');\n\n/**\n * this should match with {@link file://./../../../../utilities/cid/lib/cid-link.ts}\n * @internal\n */\nexport interface _CidLinkWrapper {\n\treadonly [CID_LINK_SYMBOL]: true;\n\n\treadonly bytes: Uint8Array;\n\treadonly $link: string;\n\n\ttoJSON(): CidLink;\n}\n\n/**\n * @internal\n */\nexport const _isCidLinkWrapper = (input: unknown): input is _CidLinkWrapper => {\n\treturn typeof input === 'object' && input !== null && CID_LINK_SYMBOL in input;\n};\n\nexport const isCidLink = (input: unknown): input is CidLink => {\n\tconst v = input as any;\n\n\treturn typeof v === 'object' && v !== null && (CID_LINK_SYMBOL in v || isCid(v.$link));\n};\n","// #__NO_SIDE_EFFECTS__\nexport const lazyProperty = <T>(obj: object, prop: string | number | symbol, value: T): T => {\n\tObject.defineProperty(obj, prop, { value });\n\treturn value;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const lazy = <T>(getter: () => T): { readonly value: T } => {\n\treturn {\n\t\tget value() {\n\t\t\tconst value = getter();\n\t\t\treturn lazyProperty(this, 'value', value);\n\t\t},\n\t};\n};\n\nexport const isArray = Array.isArray;\n\n// #__NO_SIDE_EFFECTS__\nexport const isObject = (input: unknown): input is Record<string, unknown> => {\n\treturn typeof input === 'object' && input !== null && !isArray(input);\n};\n\nexport const allowsEval = /*#__PURE__*/ lazy((): boolean => {\n\tif (typeof navigator !== 'undefined' && navigator?.userAgent?.includes('Cloudflare')) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst F = Function;\n\t\t// oxlint-disable-next-line no-new -- intentional check for Function constructor availability\n\t\tnew F('');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n});\n","/** fetch handler function */\nexport type FetchHandler = (pathname: string, init: RequestInit) => Promise<Response>;\n\n/** fetch handler in an object */\nexport interface FetchHandlerObject {\n\thandle(this: FetchHandlerObject, pathname: string, init: RequestInit): Promise<Response>;\n}\n\nexport const buildFetchHandler = (handler: FetchHandler | FetchHandlerObject): FetchHandler => {\n\tif (typeof handler === 'object') {\n\t\treturn handler.handle.bind(handler);\n\t}\n\n\treturn handler;\n};\n\nexport interface SimpleFetchHandlerOptions {\n\tservice: string | URL;\n\tfetch?: typeof globalThis.fetch;\n}\n\nexport const simpleFetchHandler = ({\n\tservice,\n\tfetch: _fetch = fetch,\n}: SimpleFetchHandlerOptions): FetchHandler => {\n\treturn async (pathname, init) => {\n\t\tconst url = new URL(pathname, service);\n\t\treturn await _fetch(url.href, init);\n\t};\n};\n","import { getPdsEndpoint, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons';\n\nimport type { ComAtprotoServerCreateSession } from '@atcute/atproto';\n\nimport { Client, ClientResponseError, isXRPCErrorPayload, ok } from './client.js';\nimport { simpleFetchHandler, type FetchHandlerObject } from './fetch-handler.js';\n\nimport { decodeJwt } from './utils/jwt.js';\n\n/**\n * represents the decoded access token, for convenience\n * @deprecated\n */\nexport interface AtpAccessJwt {\n\t/** access token scope */\n\tscope:\n\t\t| 'com.atproto.access'\n\t\t| 'com.atproto.appPass'\n\t\t| 'com.atproto.appPassPrivileged'\n\t\t| 'com.atproto.signupQueued'\n\t\t| 'com.atproto.takendown';\n\t/** account DID */\n\tsub: Did;\n\t/** expiration time in Unix seconds */\n\texp: number;\n\t/** token issued time in Unix seconds */\n\tiat: number;\n}\n\n/**\n * represents the the decoded refresh token, for convenience\n * @deprecated\n */\nexport interface AtpRefreshJwt {\n\t/** refresh token scope */\n\tscope: 'com.atproto.refresh';\n\t/** unique identifier for this session */\n\tjti: string;\n\t/** account DID */\n\tsub: Did;\n\t/** intended audience of this refresh token, in DID */\n\taud: Did;\n\t/** token expiration time in seconds */\n\texp: number;\n\t/** token issued time in seconds */\n\tiat: number;\n}\n\n/** session data, can be persisted and reused */\nexport interface AtpSessionData {\n\t/** refresh token */\n\trefreshJwt: string;\n\t/** access token */\n\taccessJwt: string;\n\t/** account handle */\n\thandle: string;\n\t/** account DID */\n\tdid: Did;\n\t/** PDS endpoint found in the DID document, this will be used as the service URI if provided */\n\tpdsUri?: string;\n\t/** email address of the account, might not be available if on app password */\n\temail?: string;\n\t/** whether the email address has been confirmed or not */\n\temailConfirmed?: boolean;\n\t/** whether the account has email-based two-factor authentication enabled */\n\temailAuthFactor?: boolean;\n\t/** whether the account is active (not deactivated, taken down, or suspended) */\n\tactive: boolean;\n\t/** possible reason for why the account is inactive */\n\tinactiveStatus?: string;\n}\n\nexport interface CredentialManagerOptions {\n\t/** PDS server URL */\n\tservice: string;\n\n\t/** custom fetch function */\n\tfetch?: typeof fetch;\n\n\t/** function called when the session expires and can't be refreshed */\n\tonExpired?: (session: AtpSessionData) => void;\n\t/** function called after a successful session refresh */\n\tonRefresh?: (session: AtpSessionData) => void;\n\t/** function called whenever the session object is updated (login, resume, refresh) */\n\tonSessionUpdate?: (session: AtpSessionData) => void;\n}\n\nexport class CredentialManager implements FetchHandlerObject {\n\t/** service URL to make authentication requests with */\n\treadonly serviceUrl: string;\n\t/** fetch implementation */\n\tfetch: typeof fetch;\n\n\t/** internal client instance for making authentication requests */\n\t#server: Client;\n\t/** holds a promise for the current refresh operation, used for debouncing */\n\t#refreshSessionPromise: Promise<void> | undefined;\n\n\t/** callback for session expiration */\n\t#onExpired: CredentialManagerOptions['onExpired'];\n\t/** callback for successful session refresh */\n\t#onRefresh: CredentialManagerOptions['onRefresh'];\n\t/** callback for session updates */\n\t#onSessionUpdate: CredentialManagerOptions['onSessionUpdate'];\n\n\t/** current active session, undefined if not authenticated */\n\tsession?: AtpSessionData;\n\n\tconstructor({\n\t\tservice,\n\t\tonExpired,\n\t\tonRefresh,\n\t\tonSessionUpdate,\n\t\tfetch: _fetch = fetch,\n\t}: CredentialManagerOptions) {\n\t\tthis.serviceUrl = service;\n\t\tthis.fetch = _fetch;\n\n\t\tthis.#server = new Client({ handler: simpleFetchHandler({ service, fetch: _fetch }) });\n\n\t\tthis.#onRefresh = onRefresh;\n\t\tthis.#onExpired = onExpired;\n\t\tthis.#onSessionUpdate = onSessionUpdate;\n\t}\n\n\t/** service URL to make actual API requests with */\n\tget dispatchUrl() {\n\t\treturn this.session?.pdsUri ?? this.serviceUrl;\n\t}\n\n\tasync handle(pathname: string, init: RequestInit): Promise<Response> {\n\t\tawait this.#refreshSessionPromise;\n\n\t\tconst url = new URL(pathname, this.dispatchUrl);\n\t\tconst headers = new Headers(init.headers);\n\n\t\tif (!this.session || headers.has('authorization')) {\n\t\t\treturn (0, this.fetch)(url, init);\n\t\t}\n\n\t\tconst initialToken = this.session.accessJwt;\n\t\theaders.set('authorization', `Bearer ${initialToken}`);\n\n\t\tconst initialResponse = await (0, this.fetch)(url, { ...init, headers });\n\n\t\tif (initialResponse.status !== 401 && !(await isExpiredTokenResponse(initialResponse))) {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.#refreshSession();\n\t\t} catch {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\t// return initial response if:\n\t\t// - request was aborted\n\t\t// - refresh failed and cleared the session\n\t\t// - token didn't actually change (refresh failed silently)\n\t\t// - request body was a stream (can't be resent)\n\t\tconst updatedToken = this.session?.accessJwt;\n\t\tif (\n\t\t\tinit.signal?.aborted ||\n\t\t\t!updatedToken ||\n\t\t\tupdatedToken === initialToken ||\n\t\t\tinit.body instanceof ReadableStream\n\t\t) {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\t// cancel initial response to avoid resource leaks (Node.js)\n\t\tawait initialResponse.body?.cancel();\n\n\t\theaders.set('authorization', `Bearer ${updatedToken}`);\n\t\treturn await (0, this.fetch)(url, { ...init, headers });\n\t}\n\n\t#refreshSession() {\n\t\treturn (this.#refreshSessionPromise ||= this.#refreshSessionInner().finally(\n\t\t\t() => (this.#refreshSessionPromise = undefined),\n\t\t));\n\t}\n\n\tasync #refreshSessionInner(): Promise<void> {\n\t\tconst currentSession = this.session;\n\t\tif (!currentSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst response = await this.#server.post('com.atproto.server.refreshSession', {\n\t\t\theaders: {\n\t\t\t\tauthorization: `Bearer ${currentSession.refreshJwt}`,\n\t\t\t},\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst isExpired =\n\t\t\t\tresponse.status === 401 ||\n\t\t\t\tresponse.data.error === 'ExpiredToken' ||\n\t\t\t\tresponse.data.error === 'InvalidToken';\n\n\t\t\tif (isExpired) {\n\t\t\t\tthis.session = undefined;\n\t\t\t\tthis.#onExpired?.(currentSession);\n\t\t\t}\n\n\t\t\tthrow new ClientResponseError(response);\n\t\t}\n\n\t\t// DID must not change during refresh\n\t\tif (response.data.did !== currentSession.did) {\n\t\t\tthis.session = undefined;\n\t\t\tthis.#onExpired?.(currentSession);\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidDID' } });\n\t\t}\n\n\t\t// protect against concurrent session updates\n\t\tif (this.session !== currentSession) {\n\t\t\tthrow new Error('concurrent session update detected');\n\t\t}\n\n\t\tthis.#updateSession({ ...currentSession, ...response.data });\n\t\tthis.#onRefresh?.(this.session!);\n\t}\n\n\t#updateSession(raw: ComAtprotoServerCreateSession.$output): AtpSessionData {\n\t\tconst didDoc = raw.didDoc as DidDocument | undefined;\n\n\t\tlet pdsUri: string | undefined;\n\t\tif (didDoc) {\n\t\t\tpdsUri = getPdsEndpoint(didDoc);\n\t\t}\n\n\t\tconst newSession: AtpSessionData = {\n\t\t\taccessJwt: raw.accessJwt,\n\t\t\trefreshJwt: raw.refreshJwt,\n\t\t\thandle: raw.handle,\n\t\t\tdid: raw.did,\n\t\t\tpdsUri: pdsUri,\n\t\t\temail: raw.email,\n\t\t\temailConfirmed: raw.emailConfirmed,\n\t\t\temailAuthFactor: raw.emailAuthFactor,\n\t\t\tactive: raw.active ?? true,\n\t\t\tinactiveStatus: raw.status,\n\t\t};\n\n\t\tthis.session = newSession;\n\t\tthis.#onSessionUpdate?.(newSession);\n\n\t\treturn newSession;\n\t}\n\n\t/**\n\t * resume from a persisted session\n\t * @param session session data, taken from `AtpAuth#session` after login\n\t */\n\tasync resume(session: AtpSessionData): Promise<AtpSessionData> {\n\t\t// protect against concurrent resume of the same session\n\t\tif (session.refreshJwt === this.session?.refreshJwt) {\n\t\t\tawait this.#refreshSessionPromise;\n\t\t\tif (!this.session || session.did !== this.session.did) {\n\t\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t\t}\n\t\t\treturn this.session;\n\t\t}\n\n\t\tconst now = Date.now() / 1_000 + 60 * 5;\n\n\t\tconst refreshToken = decodeJwt(session.refreshJwt) as AtpRefreshJwt;\n\t\tif (now >= refreshToken.exp || refreshToken.sub !== session.did) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\tconst accessToken = decodeJwt(session.accessJwt) as AtpAccessJwt;\n\t\tif (accessToken.sub !== session.did) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\t// set the session and clear any stale refresh promise\n\t\tthis.session = session;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\tif (now >= accessToken.exp) {\n\t\t\t// access token expired, need to refresh\n\t\t\tawait this.#refreshSession();\n\t\t} else {\n\t\t\t// access token still valid, fetch session info in background\n\t\t\tconst promise = ok(\n\t\t\t\tthis.#server.get('com.atproto.server.getSession', {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tauthorization: `Bearer ${session.accessJwt}`,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tpromise.then(\n\t\t\t\t(next) => {\n\t\t\t\t\tconst existing = this.session;\n\t\t\t\t\tif (!existing || existing.did !== next.did) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#updateSession({ ...existing, ...next });\n\t\t\t\t},\n\t\t\t\t(_err) => {\n\t\t\t\t\t// ignore error\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tif (!this.session) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\treturn this.session;\n\t}\n\n\t/**\n\t * sign in to an account\n\t * @param options credential options\n\t * @returns session data\n\t */\n\tasync login(options: AuthLoginOptions): Promise<AtpSessionData> {\n\t\t// reset the session\n\t\tthis.session = undefined;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\tconst session = await ok(\n\t\t\tthis.#server.post('com.atproto.server.createSession', {\n\t\t\t\tinput: {\n\t\t\t\t\tidentifier: options.identifier,\n\t\t\t\t\tpassword: options.password,\n\t\t\t\t\tauthFactorToken: options.code,\n\t\t\t\t\tallowTakendown: options.allowTakendown,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\treturn this.#updateSession(session);\n\t}\n\n\t/**\n\t * sign out of the current session, invalidating it server-side\n\t */\n\tasync logout(): Promise<void> {\n\t\tconst currentSession = this.session;\n\t\tif (!currentSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.session = undefined;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\ttry {\n\t\t\tawait this.#server.post('com.atproto.server.deleteSession', {\n\t\t\t\tas: null,\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Bearer ${currentSession.refreshJwt}`,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {\n\t\t\t// ignore errors - session is already cleared locally\n\t\t}\n\t}\n}\n\n/** credentials */\nexport interface AuthLoginOptions {\n\t/** what account to login as, this could be domain handle, DID, or email address */\n\tidentifier: string;\n\t/** account password */\n\tpassword: string;\n\t/** two-factor authentication code, if email TOTP is enabled */\n\tcode?: string;\n\t/** allow signing in even if the account has been taken down */\n\tallowTakendown?: boolean;\n}\n\nconst isExpiredTokenResponse = async (response: Response): Promise<boolean> => {\n\tif (response.status !== 400) {\n\t\treturn false;\n\t}\n\n\tif (extractContentType(response.headers) !== 'application/json') {\n\t\treturn false;\n\t}\n\n\t// this is nasty as it relies heavily on what the PDS returns, but avoiding\n\t// cloning and reading the request as much as possible is better.\n\n\t// {\"error\":\"ExpiredToken\",\"message\":\"Token has expired\"}\n\t// {\"error\":\"ExpiredToken\",\"message\":\"Token is expired\"}\n\tif (extractContentLength(response.headers) > 54 * 1.5) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst data = await response.clone().json();\n\t\tif (isXRPCErrorPayload(data)) {\n\t\t\treturn data.error === 'ExpiredToken';\n\t\t}\n\t} catch {}\n\n\treturn false;\n};\n\nconst extractContentType = (headers: Headers) => {\n\treturn headers.get('content-type')?.split(';')[0]?.trim();\n};\nconst extractContentLength = (headers: Headers) => {\n\treturn Number(headers.get('content-length') ?? ';');\n};\n","/**\n * @module\n * JWT decoding utilities for session resumption checks.\n * This module is exported for convenience and is no way part of public API,\n * it can be removed at any time.\n */\n\n/**\n * Decodes a JWT token\n * @param token The token string\n * @returns JSON object from the token\n */\nexport const decodeJwt = (token: string): unknown => {\n\tconst pos = 1;\n\tconst part = token.split('.')[1];\n\n\tlet decoded: string;\n\n\tif (typeof part !== 'string') {\n\t\tthrow new Error('invalid token: missing part ' + (pos + 1));\n\t}\n\n\ttry {\n\t\tdecoded = base64UrlDecode(part);\n\t} catch (e) {\n\t\tthrow new Error('invalid token: invalid b64 for part ' + (pos + 1) + ' (' + (e as Error).message + ')');\n\t}\n\n\ttry {\n\t\treturn JSON.parse(decoded);\n\t} catch (e) {\n\t\tthrow new Error('invalid token: invalid json for part ' + (pos + 1) + ' (' + (e as Error).message + ')');\n\t}\n};\n\n/**\n * Decodes a URL-safe Base64 string\n * @param str URL-safe Base64 that needed to be decoded\n * @returns The actual string\n */\nexport const base64UrlDecode = (str: string): string => {\n\tlet output = str.replace(/-/g, '+').replace(/_/g, '/');\n\n\tswitch (output.length % 4) {\n\t\tcase 0:\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\toutput += '==';\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\toutput += '=';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error('base64 string is not of the correct length');\n\t}\n\n\ttry {\n\t\treturn b64DecodeUnicode(output);\n\t} catch {\n\t\treturn atob(output);\n\t}\n};\n\nconst b64DecodeUnicode = (str: string): string => {\n\treturn decodeURIComponent(\n\t\tatob(str).replace(/(.)/g, (_m, p) => {\n\t\t\tlet code = p.charCodeAt(0).toString(16).toUpperCase();\n\n\t\t\tif (code.length < 2) {\n\t\t\t\tcode = '0' + code;\n\t\t\t}\n\n\t\t\treturn '%' + code;\n\t\t}),\n\t);\n};\n"],"mappings":"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","names":["signal","headers","ok","ok"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-OIQMICML.js.map"}
+98
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-OIUQ2WMN.js
··· 1 + import { 2 + OutputTransformer 3 + } from "./chunk-3G4WUGDN.js"; 4 + import { 5 + computed 6 + } from "./chunk-IZOBPV2S.js"; 7 + import { 8 + __name, 9 + init_Buffer, 10 + init_process 11 + } from "./chunk-FZQXS3RE.js"; 12 + 13 + // components/transformer/output/string/json/element.js 14 + init_Buffer(); 15 + init_process(); 16 + var JsonStringOutputTransformer = class extends OutputTransformer { 17 + static { 18 + __name(this, "JsonStringOutputTransformer"); 19 + } 20 + constructor() { 21 + super(); 22 + const base = this.base(); 23 + const manager = { 24 + facets: { 25 + ...base.facets, 26 + collection: computed(() => { 27 + const json = base.facets.collection(); 28 + return typeof json === "string" ? parseArray(json) : []; 29 + }), 30 + save: /* @__PURE__ */ __name(async (newFacets) => { 31 + const json = JSON.stringify(newFacets); 32 + await base.facets.save(json); 33 + }, "save") 34 + }, 35 + playlists: { 36 + ...base.playlists, 37 + collection: computed(() => { 38 + const json = base.playlists.collection(); 39 + return typeof json === "string" ? parseArray(json) : []; 40 + }), 41 + save: /* @__PURE__ */ __name(async (newPlaylists) => { 42 + const json = JSON.stringify(newPlaylists); 43 + await base.playlists.save(json); 44 + }, "save") 45 + }, 46 + themes: { 47 + ...base.themes, 48 + collection: computed(() => { 49 + const json = base.themes.collection(); 50 + return typeof json === "string" ? parseArray(json) : []; 51 + }), 52 + save: /* @__PURE__ */ __name(async (newThemes) => { 53 + const json = JSON.stringify(newThemes); 54 + await base.themes.save(json); 55 + }, "save") 56 + }, 57 + tracks: { 58 + ...base.tracks, 59 + collection: computed(() => { 60 + const json = base.tracks.collection(); 61 + return typeof json === "string" ? parseArray(json) : []; 62 + }), 63 + save: /* @__PURE__ */ __name(async (newTracks) => { 64 + const json = JSON.stringify(newTracks); 65 + await base.tracks.save(json); 66 + }, "save") 67 + }, 68 + // Other 69 + ready: base.ready 70 + }; 71 + this.facets = manager.facets; 72 + this.playlists = manager.playlists; 73 + this.themes = manager.themes; 74 + this.tracks = manager.tracks; 75 + this.ready = manager.ready; 76 + } 77 + }; 78 + function parseArray(json) { 79 + try { 80 + return JSON.parse(json); 81 + } catch (err) { 82 + console.error(err); 83 + return []; 84 + } 85 + } 86 + __name(parseArray, "parseArray"); 87 + var element_default = JsonStringOutputTransformer; 88 + var CLASS = JsonStringOutputTransformer; 89 + var NAME = "dtos-json"; 90 + customElements.define(NAME, CLASS); 91 + 92 + export { 93 + element_default, 94 + CLASS, 95 + NAME 96 + }; 97 + 98 + //# sourceMappingURL=./chunk-OIUQ2WMN.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-OIUQ2WMN.js.map
··· 1 + {"version":3,"sources":["/components/transformer/output/string/json/element.js"],"sourcesContent":["import { computed } from \"@common/signal.js\";\nimport { OutputTransformer } from \"../../base.js\";\n\n/**\n * @import { OutputManagerDeputy } from \"@components/output/types.d.ts\"\n */\n\n/**\n * @extends {OutputTransformer<string>}\n */\nclass JsonStringOutputTransformer extends OutputTransformer {\n constructor() {\n super();\n\n const base = this.base();\n\n /** @type {OutputManagerDeputy} */\n const manager = {\n facets: {\n ...base.facets,\n collection: computed(() => {\n const json = base.facets.collection();\n return typeof json === \"string\" ? parseArray(json) : [];\n }),\n save: async (newFacets) => {\n const json = JSON.stringify(newFacets);\n await base.facets.save(json);\n },\n },\n playlists: {\n ...base.playlists,\n collection: computed(() => {\n const json = base.playlists.collection();\n return typeof json === \"string\" ? parseArray(json) : [];\n }),\n save: async (newPlaylists) => {\n const json = JSON.stringify(newPlaylists);\n await base.playlists.save(json);\n },\n },\n themes: {\n ...base.themes,\n collection: computed(() => {\n const json = base.themes.collection();\n return typeof json === \"string\" ? parseArray(json) : [];\n }),\n save: async (newThemes) => {\n const json = JSON.stringify(newThemes);\n await base.themes.save(json);\n },\n },\n tracks: {\n ...base.tracks,\n collection: computed(() => {\n const json = base.tracks.collection();\n return typeof json === \"string\" ? parseArray(json) : [];\n }),\n save: async (newTracks) => {\n const json = JSON.stringify(newTracks);\n await base.tracks.save(json);\n },\n },\n\n // Other\n ready: base.ready,\n };\n\n // Assign manager properties to class\n this.facets = manager.facets;\n this.playlists = manager.playlists;\n this.themes = manager.themes;\n this.tracks = manager.tracks;\n this.ready = manager.ready;\n }\n}\n\n/**\n * @param {string} json\n */\nfunction parseArray(json) {\n try {\n return JSON.parse(json);\n } catch (err) {\n console.error(err);\n return [];\n }\n}\n\nexport default JsonStringOutputTransformer;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = JsonStringOutputTransformer;\nexport const NAME = \"dtos-json\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAUA,IAAM,8BAAN,cAA0C,kBAAkB;AAAA,EAV5D,OAU4D;AAAA;AAAA;AAAA,EAC1D,cAAc;AACZ,UAAM;AAEN,UAAM,OAAO,KAAK,KAAK;AAGvB,UAAM,UAAU;AAAA,MACd,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,gBAAM,OAAO,KAAK,OAAO,WAAW;AACpC,iBAAO,OAAO,SAAS,WAAW,WAAW,IAAI,IAAI,CAAC;AAAA,QACxD,CAAC;AAAA,QACD,MAAM,8BAAO,cAAc;AACzB,gBAAM,OAAO,KAAK,UAAU,SAAS;AACrC,gBAAM,KAAK,OAAO,KAAK,IAAI;AAAA,QAC7B,GAHM;AAAA,MAIR;AAAA,MACA,WAAW;AAAA,QACT,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,gBAAM,OAAO,KAAK,UAAU,WAAW;AACvC,iBAAO,OAAO,SAAS,WAAW,WAAW,IAAI,IAAI,CAAC;AAAA,QACxD,CAAC;AAAA,QACD,MAAM,8BAAO,iBAAiB;AAC5B,gBAAM,OAAO,KAAK,UAAU,YAAY;AACxC,gBAAM,KAAK,UAAU,KAAK,IAAI;AAAA,QAChC,GAHM;AAAA,MAIR;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,gBAAM,OAAO,KAAK,OAAO,WAAW;AACpC,iBAAO,OAAO,SAAS,WAAW,WAAW,IAAI,IAAI,CAAC;AAAA,QACxD,CAAC;AAAA,QACD,MAAM,8BAAO,cAAc;AACzB,gBAAM,OAAO,KAAK,UAAU,SAAS;AACrC,gBAAM,KAAK,OAAO,KAAK,IAAI;AAAA,QAC7B,GAHM;AAAA,MAIR;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,YAAY,SAAS,MAAM;AACzB,gBAAM,OAAO,KAAK,OAAO,WAAW;AACpC,iBAAO,OAAO,SAAS,WAAW,WAAW,IAAI,IAAI,CAAC;AAAA,QACxD,CAAC;AAAA,QACD,MAAM,8BAAO,cAAc;AACzB,gBAAM,OAAO,KAAK,UAAU,SAAS;AACrC,gBAAM,KAAK,OAAO,KAAK,IAAI;AAAA,QAC7B,GAHM;AAAA,MAIR;AAAA;AAAA,MAGA,OAAO,KAAK;AAAA,IACd;AAGA,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ;AACzB,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ;AACtB,SAAK,QAAQ,QAAQ;AAAA,EACvB;AACF;AAKA,SAAS,WAAW,MAAM;AACxB,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,KAAK;AACZ,YAAQ,MAAM,GAAG;AACjB,WAAO,CAAC;AAAA,EACV;AACF;AAPS;AAST,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-OIUQ2WMN.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-P3M4HQTD.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-P3M4HQTD.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-P3M4HQTD.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-P3M4HQTD.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-PJWFBDSG.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-PJWFBDSG.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-PUHBIZRM.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PUHBIZRM.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-PUHBIZRM.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PUHBIZRM.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-QQ2VIQZY.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-QQ2VIQZY.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-QQ2VIQZY.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-QQ2VIQZY.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-R65OZ4FV.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-R65OZ4FV.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-R65OZ4FV.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-R65OZ4FV.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-RG36R2PW.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-RG36R2PW.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-RG36R2PW.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-RG36R2PW.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-RSBJ77HU.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-RSBJ77HU.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-RSBJ77HU.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-RSBJ77HU.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-SSTS6DW7.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-SSTS6DW7.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-SSTS6DW7.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-SSTS6DW7.js.map
+291
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-T6K5PZ3T.js
··· 1 + import { 2 + element_default 3 + } from "./chunk-M4NQYVPY.js"; 4 + import { 5 + element_default as element_default7 6 + } from "./chunk-4XYXC3TC.js"; 7 + import { 8 + element_default as element_default11 9 + } from "./chunk-CTVRRF4G.js"; 10 + import { 11 + element_default as element_default13 12 + } from "./chunk-IR27WFXT.js"; 13 + import { 14 + element_default as element_default14 15 + } from "./chunk-C7BSJ3AC.js"; 16 + import { 17 + element_default as element_default5 18 + } from "./chunk-MA2JKS5M.js"; 19 + import { 20 + element_default as element_default6 21 + } from "./chunk-3SF5BNF4.js"; 22 + import { 23 + element_default as element_default8 24 + } from "./chunk-4MLZJ4ZD.js"; 25 + import { 26 + element_default as element_default9 27 + } from "./chunk-YMPAQN44.js"; 28 + import { 29 + element_default as element_default15 30 + } from "./chunk-U74YW6XS.js"; 31 + import { 32 + element_default as element_default3 33 + } from "./chunk-VK5BTHYP.js"; 34 + import { 35 + element_default as element_default10 36 + } from "./chunk-3VP55W4C.js"; 37 + import { 38 + element_default as element_default12 39 + } from "./chunk-ETCOFMH2.js"; 40 + import { 41 + element_default as element_default2 42 + } from "./chunk-JZ7ERCQK.js"; 43 + import { 44 + element_default as element_default4 45 + } from "./chunk-YGHHNA5S.js"; 46 + import { 47 + __name, 48 + init_Buffer, 49 + init_process 50 + } from "./chunk-FZQXS3RE.js"; 51 + 52 + // common/facets/foundation.js 53 + init_Buffer(); 54 + init_process(); 55 + var url = new URL(document.location.href); 56 + var GROUP = url.searchParams.get("group") ?? "facets"; 57 + var config = { 58 + GROUP, 59 + features: { 60 + fillQueueAutomatically, 61 + playAudioFromQueue, 62 + processInputs, 63 + searchThroughCollection 64 + }, 65 + // Elements 66 + engine: { 67 + audio, 68 + queue, 69 + repeatShuffle, 70 + scope 71 + }, 72 + orchestrator: { 73 + autoQueue, 74 + favourites, 75 + input, 76 + output, 77 + queueAudio, 78 + processTracks, 79 + scopedTracks, 80 + sources 81 + }, 82 + processor: { 83 + artwork, 84 + metadata, 85 + search 86 + } 87 + }; 88 + var foundation_default = config; 89 + function fillQueueAutomatically() { 90 + return { 91 + engine: { 92 + queue: queue(), 93 + repeatShuffle: repeatShuffle(), 94 + scope: scope() 95 + }, 96 + orchestrator: { 97 + autoQueue: autoQueue(), 98 + input: input(), 99 + output: output(), 100 + scopedTracks: scopedTracks() 101 + } 102 + }; 103 + } 104 + __name(fillQueueAutomatically, "fillQueueAutomatically"); 105 + function playAudioFromQueue() { 106 + return { 107 + engine: { 108 + audio: audio(), 109 + queue: queue() 110 + }, 111 + orchestrator: { 112 + queueAudio: queueAudio() 113 + } 114 + }; 115 + } 116 + __name(playAudioFromQueue, "playAudioFromQueue"); 117 + function processInputs() { 118 + return { 119 + orchestrator: { 120 + input: input(), 121 + output: output(), 122 + processTracks: processTracks() 123 + }, 124 + processor: { 125 + metadata: metadata() 126 + } 127 + }; 128 + } 129 + __name(processInputs, "processInputs"); 130 + function searchThroughCollection() { 131 + return { 132 + engine: { 133 + scope: scope() 134 + }, 135 + orchestrator: { 136 + output: output(), 137 + scopedTracks: scopedTracks() 138 + }, 139 + processor: { 140 + search: search() 141 + } 142 + }; 143 + } 144 + __name(searchThroughCollection, "searchThroughCollection"); 145 + function audio() { 146 + const a = new element_default2(); 147 + a.setAttribute("group", GROUP); 148 + return findExistingOrAdd(a); 149 + } 150 + __name(audio, "audio"); 151 + function queue() { 152 + const q = new element_default4(); 153 + q.setAttribute("group", GROUP); 154 + return findExistingOrAdd(q); 155 + } 156 + __name(queue, "queue"); 157 + function repeatShuffle() { 158 + const r = new element_default10(); 159 + r.setAttribute("group", GROUP); 160 + return findExistingOrAdd(r); 161 + } 162 + __name(repeatShuffle, "repeatShuffle"); 163 + function scope() { 164 + const s = new element_default12(); 165 + s.setAttribute("group", GROUP); 166 + return findExistingOrAdd(s); 167 + } 168 + __name(scope, "scope"); 169 + function artwork() { 170 + const a = new element_default(); 171 + a.setAttribute("group", GROUP); 172 + return findExistingOrAdd(a); 173 + } 174 + __name(artwork, "artwork"); 175 + function metadata() { 176 + const m = new element_default7(); 177 + m.setAttribute("group", GROUP); 178 + return findExistingOrAdd(m); 179 + } 180 + __name(metadata, "metadata"); 181 + function search() { 182 + const s = new element_default11(); 183 + s.setAttribute("group", GROUP); 184 + return findExistingOrAdd(s); 185 + } 186 + __name(search, "search"); 187 + function autoQueue() { 188 + const q = queue(); 189 + const r = repeatShuffle(); 190 + const t = scopedTracks(); 191 + const aqo = new element_default3(); 192 + aqo.setAttribute("group", GROUP); 193 + aqo.setAttribute("queue-engine-selector", q.selector); 194 + aqo.setAttribute("repeat-shuffle-engine-selector", r.selector); 195 + aqo.setAttribute("tracks-selector", t.selector); 196 + return findExistingOrAdd(aqo); 197 + } 198 + __name(autoQueue, "autoQueue"); 199 + function input() { 200 + const i = new element_default5(); 201 + i.setAttribute("group", GROUP); 202 + i.setAttribute("id", "input"); 203 + return findExistingOrAdd(i); 204 + } 205 + __name(input, "input"); 206 + function output() { 207 + const o = new element_default6(); 208 + o.setAttribute("group", GROUP); 209 + o.setAttribute("id", "output"); 210 + return findExistingOrAdd(o); 211 + } 212 + __name(output, "output"); 213 + function processTracks(opts = { disableWhenReady: false }) { 214 + const i = input(); 215 + const o = output(); 216 + const m = metadata(); 217 + const opt = new element_default8(); 218 + opt.setAttribute("group", GROUP); 219 + opt.setAttribute("input-selector", i.selector); 220 + opt.setAttribute("output-selector", o.selector); 221 + opt.setAttribute("metadata-processor-selector", m.selector); 222 + if (!opts.disableWhenReady) { 223 + opt.toggleAttribute("process-when-ready"); 224 + } 225 + return findExistingOrAdd(opt); 226 + } 227 + __name(processTracks, "processTracks"); 228 + function queueAudio() { 229 + const a = audio(); 230 + const i = input(); 231 + const q = queue(); 232 + const r = repeatShuffle(); 233 + const oqa = new element_default9(); 234 + oqa.setAttribute("group", GROUP); 235 + oqa.setAttribute("audio-engine-selector", a.selector); 236 + oqa.setAttribute("input-selector", i.selector); 237 + oqa.setAttribute("queue-engine-selector", q.selector); 238 + oqa.setAttribute("repeat-shuffle-engine-selector", r.selector); 239 + return findExistingOrAdd(oqa); 240 + } 241 + __name(queueAudio, "queueAudio"); 242 + function scopedTracks() { 243 + const i = input(); 244 + const o = output(); 245 + const e = scope(); 246 + const s = search(); 247 + const sto = new element_default13(); 248 + sto.setAttribute("group", GROUP); 249 + sto.setAttribute("input-selector", i.selector); 250 + sto.setAttribute("output-selector", o.selector); 251 + sto.setAttribute("scope-engine-selector", e.selector); 252 + sto.setAttribute("search-processor-selector", s.selector); 253 + return findExistingOrAdd(sto); 254 + } 255 + __name(scopedTracks, "scopedTracks"); 256 + function favourites() { 257 + const o = output(); 258 + const fo = new element_default14(); 259 + fo.setAttribute("group", GROUP); 260 + fo.setAttribute("output-selector", o.selector); 261 + return findExistingOrAdd(fo); 262 + } 263 + __name(favourites, "favourites"); 264 + function sources() { 265 + const i = input(); 266 + const o = output(); 267 + const so = new element_default15(); 268 + so.setAttribute("group", GROUP); 269 + so.setAttribute("input-selector", i.selector); 270 + so.setAttribute("output-selector", o.selector); 271 + return findExistingOrAdd(so); 272 + } 273 + __name(sources, "sources"); 274 + function findExistingOrAdd(element) { 275 + const alreadyAdded = document.body.querySelector(element.selector); 276 + if (!alreadyAdded) { 277 + document.body.append(element); 278 + return element; 279 + } 280 + return alreadyAdded; 281 + } 282 + __name(findExistingOrAdd, "findExistingOrAdd"); 283 + 284 + export { 285 + GROUP, 286 + config, 287 + foundation_default, 288 + findExistingOrAdd 289 + }; 290 + 291 + //# sourceMappingURL=./chunk-T6K5PZ3T.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-T6K5PZ3T.js.map
··· 1 + {"version":3,"sources":["/common/facets/foundation.js"],"sourcesContent":["import ArtworkProcessor from \"@components/processor/artwork/element.js\";\nimport AudioEngine from \"@components/engine/audio/element.js\";\nimport AutoQueueOrchestrator from \"@components/orchestrator/auto-queue/element.js\";\nimport Queue from \"@components/engine/queue/element.js\";\nimport InputOrchestrator from \"@components/orchestrator/input/element.js\";\nimport OutputOrchestrator from \"@components/orchestrator/output/element.js\";\nimport MetadataProcessor from \"@components/processor/metadata/element.js\";\nimport ProcessTracksOrchestrator from \"@components/orchestrator/process-tracks/element.js\";\nimport QueueAudioOrchestrator from \"@components/orchestrator/queue-audio/element.js\";\nimport RepeatShuffleEngine from \"@components/engine/repeat-shuffle/element.js\";\nimport SearchProcessor from \"@components/processor/search/element.js\";\nimport ScopeEngine from \"@components/engine/scope/element.js\";\nimport ScopedTracksOrchestrator from \"@components/orchestrator/scoped-tracks/element.js\";\nimport FavouritesOrchestrator from \"@components/orchestrator/favourites/element.js\";\nimport SourcesOrchestrator from \"@components/orchestrator/sources/element.js\";\n\n/**\n * @import { DiffuseElement } from \"@toko/diffuse/common/element.js\";\n */\n\nconst url = new URL(document.location.href);\nexport const GROUP = url.searchParams.get(\"group\") ?? \"facets\";\n\n/**\n * Default config for facets.\n */\nexport const config = {\n GROUP,\n\n features: {\n fillQueueAutomatically,\n playAudioFromQueue,\n processInputs,\n searchThroughCollection,\n },\n\n // Elements\n engine: {\n audio,\n queue,\n repeatShuffle,\n scope,\n },\n orchestrator: {\n autoQueue,\n favourites,\n input,\n output,\n queueAudio,\n processTracks,\n scopedTracks,\n sources,\n },\n processor: {\n artwork,\n metadata,\n search,\n },\n};\n\nexport default config;\n\n// 📦️\n\nfunction fillQueueAutomatically() {\n return {\n engine: {\n queue: queue(),\n repeatShuffle: repeatShuffle(),\n scope: scope(),\n },\n orchestrator: {\n autoQueue: autoQueue(),\n input: input(),\n output: output(),\n scopedTracks: scopedTracks(),\n },\n };\n}\n\nfunction playAudioFromQueue() {\n return {\n engine: {\n audio: audio(),\n queue: queue(),\n },\n orchestrator: {\n queueAudio: queueAudio(),\n },\n };\n}\n\nfunction processInputs() {\n return {\n orchestrator: {\n input: input(),\n output: output(),\n processTracks: processTracks(),\n },\n processor: {\n metadata: metadata(),\n },\n };\n}\n\nfunction searchThroughCollection() {\n return {\n engine: {\n scope: scope(),\n },\n orchestrator: {\n output: output(),\n scopedTracks: scopedTracks(),\n },\n processor: {\n search: search(),\n },\n };\n}\n\n// 🥡\n\n// Engines\nfunction audio() {\n const a = new AudioEngine();\n a.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(a);\n}\n\nfunction queue() {\n const q = new Queue();\n q.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(q);\n}\n\nfunction repeatShuffle() {\n const r = new RepeatShuffleEngine();\n r.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(r);\n}\n\nfunction scope() {\n const s = new ScopeEngine();\n s.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(s);\n}\n\n// Processors\nfunction artwork() {\n const a = new ArtworkProcessor();\n a.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(a);\n}\n\nfunction metadata() {\n const m = new MetadataProcessor();\n m.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(m);\n}\n\nfunction search() {\n const s = new SearchProcessor();\n s.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(s);\n}\n\n// Orchestrators\nfunction autoQueue() {\n const q = queue();\n const r = repeatShuffle();\n const t = scopedTracks();\n\n const aqo = new AutoQueueOrchestrator();\n aqo.setAttribute(\"group\", GROUP);\n aqo.setAttribute(\"queue-engine-selector\", q.selector);\n aqo.setAttribute(\"repeat-shuffle-engine-selector\", r.selector);\n aqo.setAttribute(\"tracks-selector\", t.selector);\n\n return findExistingOrAdd(aqo);\n}\n\nfunction input() {\n const i = new InputOrchestrator();\n i.setAttribute(\"group\", GROUP);\n i.setAttribute(\"id\", \"input\");\n\n return findExistingOrAdd(i);\n}\n\nfunction output() {\n const o = new OutputOrchestrator();\n o.setAttribute(\"group\", GROUP);\n o.setAttribute(\"id\", \"output\");\n\n return findExistingOrAdd(o);\n}\n\n/**\n * @param {Object} opts - Options\n * @param {boolean} [opts.disableWhenReady] - Whether to disable processing when ready.\n */\nfunction processTracks(opts = { disableWhenReady: false }) {\n const i = input();\n const o = output();\n const m = metadata();\n\n const opt = new ProcessTracksOrchestrator();\n opt.setAttribute(\"group\", GROUP);\n opt.setAttribute(\"input-selector\", i.selector);\n opt.setAttribute(\"output-selector\", o.selector);\n opt.setAttribute(\"metadata-processor-selector\", m.selector);\n\n if (!opts.disableWhenReady) {\n opt.toggleAttribute(\"process-when-ready\");\n }\n\n return findExistingOrAdd(opt);\n}\n\nfunction queueAudio() {\n const a = audio();\n const i = input();\n const q = queue();\n const r = repeatShuffle();\n\n const oqa = new QueueAudioOrchestrator();\n oqa.setAttribute(\"group\", GROUP);\n oqa.setAttribute(\"audio-engine-selector\", a.selector);\n oqa.setAttribute(\"input-selector\", i.selector);\n oqa.setAttribute(\"queue-engine-selector\", q.selector);\n oqa.setAttribute(\"repeat-shuffle-engine-selector\", r.selector);\n\n return findExistingOrAdd(oqa);\n}\n\nfunction scopedTracks() {\n const i = input();\n const o = output();\n const e = scope();\n const s = search();\n\n const sto = new ScopedTracksOrchestrator();\n sto.setAttribute(\"group\", GROUP);\n sto.setAttribute(\"input-selector\", i.selector);\n sto.setAttribute(\"output-selector\", o.selector);\n sto.setAttribute(\"scope-engine-selector\", e.selector);\n sto.setAttribute(\"search-processor-selector\", s.selector);\n\n return findExistingOrAdd(sto);\n}\n\nfunction favourites() {\n const o = output();\n\n const fo = new FavouritesOrchestrator();\n fo.setAttribute(\"group\", GROUP);\n fo.setAttribute(\"output-selector\", o.selector);\n\n return findExistingOrAdd(fo);\n}\n\nfunction sources() {\n const i = input();\n const o = output();\n const so = new SourcesOrchestrator();\n so.setAttribute(\"group\", GROUP);\n so.setAttribute(\"input-selector\", i.selector);\n so.setAttribute(\"output-selector\", o.selector);\n\n return findExistingOrAdd(so);\n}\n\n// 🛠️\n\n/**\n * @template {DiffuseElement} T\n * @param {T} element\n * @returns {T}\n */\nexport function findExistingOrAdd(element) {\n /** @type {T | null} */\n const alreadyAdded = document.body.querySelector(element.selector);\n if (!alreadyAdded) {\n document.body.append(element);\n return element;\n }\n\n return alreadyAdded;\n}\n"],"mappings":"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","names":["element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-T6K5PZ3T.js.map"}
+84
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-U74YW6XS.js
··· 1 + import { 2 + BroadcastableDiffuseElement, 3 + query 4 + } from "./chunk-H46AZIKM.js"; 5 + import { 6 + signal 7 + } from "./chunk-IZOBPV2S.js"; 8 + import { 9 + groupTracksPerScheme 10 + } from "./chunk-DUCTMCPX.js"; 11 + import { 12 + __name, 13 + init_Buffer, 14 + init_process 15 + } from "./chunk-FZQXS3RE.js"; 16 + 17 + // components/orchestrator/sources/element.js 18 + init_Buffer(); 19 + init_process(); 20 + var Sources = class extends BroadcastableDiffuseElement { 21 + static { 22 + __name(this, "Sources"); 23 + } 24 + static NAME = "diffuse/orchestrator/sources"; 25 + // SIGNALS 26 + #sources = signal( 27 + /** @type {{ [scheme: string]: Source[] }} */ 28 + {} 29 + ); 30 + // STATE 31 + sources = this.#sources.get; 32 + // LIFECYCLE 33 + /** 34 + * @override 35 + */ 36 + async connectedCallback() { 37 + if (this.hasAttribute("group")) { 38 + this.broadcast(this.nameWithGroup, {}); 39 + } 40 + super.connectedCallback(); 41 + const input = query(this, "input-selector"); 42 + const output = query(this, "output-selector"); 43 + await customElements.whenDefined(input.localName); 44 + await customElements.whenDefined(output.localName); 45 + const singleInputMode = !!input.SCHEME; 46 + const deps = ( 47 + /** @type {{ [k: string]: InputElement }} */ 48 + singleInputMode ? {} : input.dependencies() 49 + ); 50 + this.effect(() => { 51 + const tracks = output.tracks.collection(); 52 + const groups = groupTracksPerScheme(tracks); 53 + const record = {}; 54 + Object.entries(groups).map(([scheme, tracks2]) => { 55 + let sources; 56 + if (singleInputMode) { 57 + if (input.SCHEME === scheme) { 58 + sources = input.sources(tracks2); 59 + } else { 60 + sources = []; 61 + } 62 + } else { 63 + const dep = deps[scheme]; 64 + if (!dep) sources = []; 65 + else sources = dep.sources(tracks2); 66 + } 67 + record[scheme] = sources; 68 + }); 69 + this.#sources.value = record; 70 + }); 71 + } 72 + }; 73 + var element_default = Sources; 74 + var CLASS = Sources; 75 + var NAME = "do-sources"; 76 + customElements.define(NAME, CLASS); 77 + 78 + export { 79 + element_default, 80 + CLASS, 81 + NAME 82 + }; 83 + 84 + //# sourceMappingURL=./chunk-U74YW6XS.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-U74YW6XS.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/sources/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement, query } from \"@common/element.js\";\nimport { groupTracksPerScheme } from \"@common/utils.js\";\nimport { signal } from \"@common/signal.js\";\n\n/**\n * @import {InputElement, Source} from \"@components/input/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass Sources extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/orchestrator/sources\";\n\n // SIGNALS\n\n #sources = signal(/** @type {{ [scheme: string]: Source[] }} */ ({}));\n\n // STATE\n\n sources = this.#sources.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n this.broadcast(this.nameWithGroup, {});\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {InputElement} */\n const input = query(this, \"input-selector\");\n\n /** @type {OutputElement} */\n const output = query(this, \"output-selector\");\n\n // Wait until defined\n await customElements.whenDefined(input.localName);\n await customElements.whenDefined(output.localName);\n\n const singleInputMode = !!input.SCHEME;\n const deps =\n /** @type {{ [k: string]: InputElement }} */ (singleInputMode\n ? {}\n : input.dependencies());\n\n // Effects\n this.effect(() => {\n const tracks = output.tracks.collection();\n const groups = groupTracksPerScheme(tracks);\n\n /** @type {{ [scheme: string]: Source[] }} */\n const record = {};\n\n Object.entries(groups).map(([scheme, tracks]) => {\n /** @type {Source[]} */\n let sources;\n\n if (singleInputMode) {\n if (input.SCHEME === scheme) {\n sources = input.sources(tracks);\n } else {\n sources = [];\n }\n } else {\n const dep = deps[scheme];\n if (!dep) sources = [];\n else sources = dep.sources(tracks);\n }\n\n record[scheme] = sources;\n });\n\n this.#sources.value = record;\n });\n }\n}\n\nexport default Sources;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = Sources;\nexport const NAME = \"do-sources\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAaA,IAAM,UAAN,cAAsB,4BAA4B;AAAA,EAblD,OAakD;AAAA;AAAA;AAAA,EAChD,OAAO,OAAO;AAAA;AAAA,EAId,WAAW;AAAA;AAAA,IAAsD,CAAC;AAAA,EAAE;AAAA;AAAA,EAIpE,UAAU,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,MAAM,oBAAoB;AAExB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,WAAK,UAAU,KAAK,eAAe,CAAC,CAAC;AAAA,IACvC;AAGA,UAAM,kBAAkB;AAGxB,UAAM,QAAQ,MAAM,MAAM,gBAAgB;AAG1C,UAAM,SAAS,MAAM,MAAM,iBAAiB;AAG5C,UAAM,eAAe,YAAY,MAAM,SAAS;AAChD,UAAM,eAAe,YAAY,OAAO,SAAS;AAEjD,UAAM,kBAAkB,CAAC,CAAC,MAAM;AAChC,UAAM;AAAA;AAAA,MAC0C,kBAC1C,CAAC,IACD,MAAM,aAAa;AAAA;AAGzB,SAAK,OAAO,MAAM;AAChB,YAAM,SAAS,OAAO,OAAO,WAAW;AACxC,YAAM,SAAS,qBAAqB,MAAM;AAG1C,YAAM,SAAS,CAAC;AAEhB,aAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQA,OAAM,MAAM;AAE/C,YAAI;AAEJ,YAAI,iBAAiB;AACnB,cAAI,MAAM,WAAW,QAAQ;AAC3B,sBAAU,MAAM,QAAQA,OAAM;AAAA,UAChC,OAAO;AACL,sBAAU,CAAC;AAAA,UACb;AAAA,QACF,OAAO;AACL,gBAAM,MAAM,KAAK,MAAM;AACvB,cAAI,CAAC,IAAK,WAAU,CAAC;AAAA,cAChB,WAAU,IAAI,QAAQA,OAAM;AAAA,QACnC;AAEA,eAAO,MAAM,IAAI;AAAA,MACnB,CAAC;AAED,WAAK,SAAS,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":["tracks"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-U74YW6XS.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-UACRVUBF.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-UACRVUBF.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-UACRVUBF.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-UACRVUBF.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-UGE3FKYA.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-UGE3FKYA.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-UGE3FKYA.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-UGE3FKYA.js.map
+71
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-VK5BTHYP.js
··· 1 + import { 2 + BroadcastableDiffuseElement, 3 + query 4 + } from "./chunk-H46AZIKM.js"; 5 + import { 6 + __name, 7 + init_Buffer, 8 + init_process 9 + } from "./chunk-FZQXS3RE.js"; 10 + 11 + // components/orchestrator/auto-queue/element.js 12 + init_Buffer(); 13 + init_process(); 14 + var AutoTracksOrchestrator = class extends BroadcastableDiffuseElement { 15 + static { 16 + __name(this, "AutoTracksOrchestrator"); 17 + } 18 + static NAME = "diffuse/orchestrator/auto-queue"; 19 + // LIFECYCLE 20 + /** 21 + * @override 22 + */ 23 + async connectedCallback() { 24 + if (this.hasAttribute("group")) { 25 + this.broadcast(this.nameWithGroup, {}); 26 + } 27 + super.connectedCallback(); 28 + const queue = query(this, "queue-engine-selector"); 29 + const repeatShuffle = query(this, "repeat-shuffle-engine-selector"); 30 + const tracksElement = query(this, "tracks-selector"); 31 + await customElements.whenDefined(queue.localName); 32 + await customElements.whenDefined(repeatShuffle.localName); 33 + await customElements.whenDefined(tracksElement.localName); 34 + this.effect(() => { 35 + const tracks = tracksElement.tracks(); 36 + this.isLeader().then(async (isLeader) => { 37 + if (!isLeader) return; 38 + queue.supply({ tracks }); 39 + }); 40 + }); 41 + let lastShuffle = repeatShuffle.shuffle(); 42 + let lastFingerprint = queue.supplyFingerprint(); 43 + this.effect(() => { 44 + const trigger = queue.now(); 45 + const fingerprint = queue.supplyFingerprint(); 46 + const shuffled = repeatShuffle.shuffle(); 47 + this.isLeader().then((isLeader) => { 48 + if (!isLeader) return; 49 + if (shuffled !== lastShuffle || fingerprint !== lastFingerprint) { 50 + lastShuffle = shuffled; 51 + lastFingerprint = fingerprint; 52 + queue.clear({ manualOnly: true }); 53 + } 54 + queue.fill({ amount: 10, shuffled: repeatShuffle.shuffle() }); 55 + if (!trigger) queue.shift(); 56 + }); 57 + }); 58 + } 59 + }; 60 + var element_default = AutoTracksOrchestrator; 61 + var CLASS = AutoTracksOrchestrator; 62 + var NAME = "do-auto-queue"; 63 + customElements.define(NAME, CLASS); 64 + 65 + export { 66 + element_default, 67 + CLASS, 68 + NAME 69 + }; 70 + 71 + //# sourceMappingURL=./chunk-VK5BTHYP.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-VK5BTHYP.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/auto-queue/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement, query } from \"@common/element.js\";\n\n/**\n * @import {DiffuseElement} from \"@common/element.js\";\n * @import {SignalReader} from \"@common/signal.d.ts\";\n * @import {Track} from \"@definitions/types.d.ts\"\n * @import RepeatShuffleEngine from \"@components/engine/repeat-shuffle/element.js\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * Update the queue pool whenever tracks have been loaded,\n * or the tracks collection changes.\n */\nclass AutoTracksOrchestrator extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/orchestrator/auto-queue\";\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n this.broadcast(this.nameWithGroup, {});\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {import(\"@components/engine/queue/element.js\").CLASS} */\n const queue = query(this, \"queue-engine-selector\");\n\n /** @type {RepeatShuffleEngine} */\n const repeatShuffle = query(this, \"repeat-shuffle-engine-selector\");\n\n /** @type {DiffuseElement & { tracks: SignalReader<Track[]> }} */\n const tracksElement = query(this, \"tracks-selector\");\n\n // When defined\n await customElements.whenDefined(queue.localName);\n await customElements.whenDefined(repeatShuffle.localName);\n await customElements.whenDefined(tracksElement.localName);\n\n // Watch tracks\n this.effect(() => {\n const tracks = tracksElement.tracks();\n\n this.isLeader().then(async (isLeader) => {\n if (!isLeader) return;\n queue.supply({ tracks });\n });\n });\n\n // Automatically fill queue\n let lastShuffle = repeatShuffle.shuffle();\n let lastFingerprint = queue.supplyFingerprint();\n\n this.effect(() => {\n const trigger = queue.now();\n const fingerprint = queue.supplyFingerprint();\n const shuffled = repeatShuffle.shuffle();\n\n this.isLeader().then((isLeader) => {\n if (!isLeader) return;\n\n // Clear non-manual items from the queue\n // when 'shuffle' gets turned off or on;\n // or when queue supply changes.\n if (shuffled !== lastShuffle || fingerprint !== lastFingerprint) {\n lastShuffle = shuffled;\n lastFingerprint = fingerprint;\n queue.clear({ manualOnly: true });\n }\n\n queue.fill({ amount: 10, shuffled: repeatShuffle.shuffle() });\n\n // Insert now-playing track if there's none\n if (!trigger) queue.shift();\n });\n });\n }\n}\n\nexport default AutoTracksOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = AutoTracksOrchestrator;\nexport const NAME = \"do-auto-queue\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;AAAA;AAAA;AAiBA,IAAM,yBAAN,cAAqC,4BAA4B;AAAA,EAjBjE,OAiBiE;AAAA;AAAA;AAAA,EAC/D,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,MAAM,oBAAoB;AAExB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,WAAK,UAAU,KAAK,eAAe,CAAC,CAAC;AAAA,IACvC;AAGA,UAAM,kBAAkB;AAGxB,UAAM,QAAQ,MAAM,MAAM,uBAAuB;AAGjD,UAAM,gBAAgB,MAAM,MAAM,gCAAgC;AAGlE,UAAM,gBAAgB,MAAM,MAAM,iBAAiB;AAGnD,UAAM,eAAe,YAAY,MAAM,SAAS;AAChD,UAAM,eAAe,YAAY,cAAc,SAAS;AACxD,UAAM,eAAe,YAAY,cAAc,SAAS;AAGxD,SAAK,OAAO,MAAM;AAChB,YAAM,SAAS,cAAc,OAAO;AAEpC,WAAK,SAAS,EAAE,KAAK,OAAO,aAAa;AACvC,YAAI,CAAC,SAAU;AACf,cAAM,OAAO,EAAE,OAAO,CAAC;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,cAAc,cAAc,QAAQ;AACxC,QAAI,kBAAkB,MAAM,kBAAkB;AAE9C,SAAK,OAAO,MAAM;AAChB,YAAM,UAAU,MAAM,IAAI;AAC1B,YAAM,cAAc,MAAM,kBAAkB;AAC5C,YAAM,WAAW,cAAc,QAAQ;AAEvC,WAAK,SAAS,EAAE,KAAK,CAAC,aAAa;AACjC,YAAI,CAAC,SAAU;AAKf,YAAI,aAAa,eAAe,gBAAgB,iBAAiB;AAC/D,wBAAc;AACd,4BAAkB;AAClB,gBAAM,MAAM,EAAE,YAAY,KAAK,CAAC;AAAA,QAClC;AAEA,cAAM,KAAK,EAAE,QAAQ,IAAI,UAAU,cAAc,QAAQ,EAAE,CAAC;AAG5D,YAAI,CAAC,QAAS,OAAM,MAAM;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-VK5BTHYP.js.map"}
+66
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-VKEUU6QK.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + __export, 6 + __name, 7 + init_Buffer, 8 + init_process 9 + } from "./chunk-FZQXS3RE.js"; 10 + 11 + // components/configurator/input/element.js 12 + var element_exports = {}; 13 + __export(element_exports, { 14 + CLASS: () => CLASS, 15 + NAME: () => NAME, 16 + default: () => element_default 17 + }); 18 + init_Buffer(); 19 + init_process(); 20 + var InputConfigurator = class extends DiffuseElement { 21 + static { 22 + __name(this, "InputConfigurator"); 23 + } 24 + static NAME = "diffuse/configurator/input"; 25 + static WORKER_URL = "components/configurator/input/worker.js"; 26 + constructor() { 27 + super(); 28 + const proxy = this.workerProxy(); 29 + this.consult = proxy.consult; 30 + this.detach = proxy.detach; 31 + this.groupConsult = proxy.groupConsult; 32 + this.list = proxy.list; 33 + this.resolve = proxy.resolve; 34 + } 35 + // WORKERS 36 + /** 37 + * @override 38 + */ 39 + dependencies() { 40 + return this.inputs(); 41 + } 42 + inputs() { 43 + return Object.fromEntries( 44 + Array.from(this.children).map((element) => { 45 + const input = ( 46 + /** @type {InputElement} */ 47 + element 48 + ); 49 + return [input.SCHEME, input]; 50 + }) 51 + ); 52 + } 53 + }; 54 + var element_default = InputConfigurator; 55 + var CLASS = InputConfigurator; 56 + var NAME = "dc-input"; 57 + customElements.define(NAME, CLASS); 58 + 59 + export { 60 + element_default, 61 + CLASS, 62 + NAME, 63 + element_exports 64 + }; 65 + 66 + //# sourceMappingURL=./chunk-VKEUU6QK.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-VKEUU6QK.js.map
··· 1 + {"version":3,"sources":["/components/configurator/input/element.js"],"sourcesContent":["import { DiffuseElement, whenElementsDefined } from \"@common/element.js\";\n\n/**\n * @import {ProxiedActions, Tunnel} from \"@common/worker.d.ts\"\n * @import {InputActions, InputElement} from \"@components/input/types.d.ts\"\n */\n\n/**\n * @typedef {{ element: InputElement, tunnel: Tunnel, worker: Worker | SharedWorker }} Input\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<InputActions>}\n */\nclass InputConfigurator extends DiffuseElement {\n static NAME = \"diffuse/configurator/input\";\n static WORKER_URL = \"components/configurator/input/worker.js\";\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<InputActions>} */\n const proxy = this.workerProxy();\n\n this.consult = proxy.consult;\n this.detach = proxy.detach;\n this.groupConsult = proxy.groupConsult;\n this.list = proxy.list;\n this.resolve = proxy.resolve;\n }\n\n // WORKERS\n\n /**\n * @override\n */\n dependencies() {\n return this.inputs();\n }\n\n inputs() {\n return Object.fromEntries(\n Array.from(this.children).map((element) => {\n const input = /** @type {InputElement} */ (element);\n return [input.SCHEME, input];\n }),\n );\n }\n}\n\nexport default InputConfigurator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = InputConfigurator;\nexport const NAME = \"dc-input\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA,IAAM,oBAAN,cAAgC,eAAe;AAAA,EAlB/C,OAkB+C;AAAA;AAAA;AAAA,EAC7C,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,cAAc;AACZ,UAAM;AAGN,UAAM,QAAQ,KAAK,YAAY;AAE/B,SAAK,UAAU,MAAM;AACrB,SAAK,SAAS,MAAM;AACpB,SAAK,eAAe,MAAM;AAC1B,SAAK,OAAO,MAAM;AAClB,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,SAAS;AACP,WAAO,OAAO;AAAA,MACZ,MAAM,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,YAAY;AACzC,cAAM;AAAA;AAAA,UAAqC;AAAA;AAC3C,eAAO,CAAC,MAAM,QAAQ,KAAK;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-VKEUU6QK.js.map"}
+122
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-WBRIGWBU.js
··· 1 + import { 2 + outputManager 3 + } from "./chunk-5UTOUDDD.js"; 4 + import { 5 + BroadcastableDiffuseElement 6 + } from "./chunk-H46AZIKM.js"; 7 + import { 8 + __name, 9 + init_Buffer, 10 + init_process 11 + } from "./chunk-FZQXS3RE.js"; 12 + 13 + // components/output/polymorphic/indexed-db/element.js 14 + init_Buffer(); 15 + init_process(); 16 + var IndexedDBOutput = class extends BroadcastableDiffuseElement { 17 + static { 18 + __name(this, "IndexedDBOutput"); 19 + } 20 + static NAME = "diffuse/output/polymorphic/indexed-db"; 21 + static WORKER_URL = "components/output/polymorphic/indexed-db/worker.js"; 22 + #manager; 23 + constructor() { 24 + super(); 25 + this.proxy = this.workerProxy(); 26 + this.#manager = outputManager({ 27 + facets: { 28 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 29 + get: /* @__PURE__ */ __name(() => this.#get("facets"), "get"), 30 + put: /* @__PURE__ */ __name((data) => this.#put("facets", data), "put") 31 + }, 32 + init: /* @__PURE__ */ __name(() => this.whenConnected(), "init"), 33 + playlists: { 34 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 35 + get: /* @__PURE__ */ __name(() => this.#get("playlists"), "get"), 36 + put: /* @__PURE__ */ __name((data) => this.#put("playlists", data), "put") 37 + }, 38 + themes: { 39 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 40 + get: /* @__PURE__ */ __name(() => this.#get("themes"), "get"), 41 + put: /* @__PURE__ */ __name((data) => this.#put("themes", data), "put") 42 + }, 43 + tracks: { 44 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 45 + get: /* @__PURE__ */ __name(() => this.#get("tracks"), "get"), 46 + put: /* @__PURE__ */ __name((data) => this.#put("tracks", data), "put") 47 + } 48 + }); 49 + this.facets = this.#manager.facets; 50 + this.playlists = this.#manager.playlists; 51 + this.themes = this.#manager.themes; 52 + this.tracks = this.#manager.tracks; 53 + this.ready = () => true; 54 + } 55 + // LIFECYCLE 56 + /** 57 + * @override 58 + */ 59 + connectedCallback() { 60 + if (this.hasAttribute("group")) { 61 + const actions = this.broadcast( 62 + `${this.nameWithGroup}${this.namespace.length ? "/" + this.namespace.replace(/\/$/, "") : ""}`, 63 + { 64 + put: { strategy: "replicate", fn: this.#putIncoming } 65 + } 66 + ); 67 + if (actions) { 68 + this.#put = this.#putOutgoing(actions.put); 69 + } 70 + } 71 + super.connectedCallback(); 72 + } 73 + // GET & PUT 74 + /** @param {string} name */ 75 + #getProxy = /* @__PURE__ */ __name((name) => this.proxy.get({ name: this.#cat(name) }), "#getProxy"); 76 + #get = this.#getProxy; 77 + /** @param {string} name; @param {any} data */ 78 + #putProxy = /* @__PURE__ */ __name((name, data) => this.proxy.put({ name: this.#cat(name), data }), "#putProxy"); 79 + #put = this.#putProxy; 80 + /** 81 + * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, name: string, data: any) => Promise<void>} action 82 + * @returns {(name: string, data: any) => Promise<void>} 83 + */ 84 + #putOutgoing = /* @__PURE__ */ __name((action) => async (name, data) => { 85 + return await action(this.uuid, name, data); 86 + }, "#putOutgoing"); 87 + /** 88 + * @param {ReturnType<typeof crypto.randomUUID>} uuidSender 89 + * @param {string} name 90 + * @param {any} data 91 + */ 92 + #putIncoming(uuidSender, name, data) { 93 + if (uuidSender === this.uuid) { 94 + this.#putProxy(name, data); 95 + } else { 96 + if (name === "facets") this.#manager.signals.facets.value = data; 97 + if (name === "playlists") this.#manager.signals.playlists.value = data; 98 + if (name === "themes") this.#manager.signals.themes.value = data; 99 + if (name === "tracks") this.#manager.signals.tracks.value = data; 100 + } 101 + } 102 + // 🛠️ 103 + get namespace() { 104 + return this.hasAttribute("namespace") ? this.getAttribute("namespace") + "/" : ""; 105 + } 106 + /** @param {string} name */ 107 + #cat(name) { 108 + return `${this.namespace}${name}`; 109 + } 110 + }; 111 + var element_default = IndexedDBOutput; 112 + var CLASS = IndexedDBOutput; 113 + var NAME = "dop-indexed-db"; 114 + customElements.define(NAME, IndexedDBOutput); 115 + 116 + export { 117 + element_default, 118 + CLASS, 119 + NAME 120 + }; 121 + 122 + //# sourceMappingURL=./chunk-WBRIGWBU.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-WBRIGWBU.js.map
··· 1 + {"version":3,"sources":["/components/output/polymorphic/indexed-db/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement } from \"@common/element.js\";\nimport { outputManager } from \"../../common.js\";\n\n/**\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {OutputElement, OutputManager, OutputWorkerActions} from \"../../types.d.ts\"\n * @import {SupportedDataTypes} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {OutputElement<SupportedDataTypes>}\n */\nclass IndexedDBOutput extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/output/polymorphic/indexed-db\";\n static WORKER_URL = \"components/output/polymorphic/indexed-db/worker.js\";\n\n #manager;\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<OutputWorkerActions<SupportedDataTypes>>} */\n this.proxy = this.workerProxy();\n\n /** @type {OutputManager<SupportedDataTypes>} */\n this.#manager = outputManager({\n facets: {\n empty: () => undefined,\n get: () => this.#get(\"facets\"),\n put: (data) => this.#put(\"facets\", data),\n },\n init: () => this.whenConnected(),\n playlists: {\n empty: () => undefined,\n get: () => this.#get(\"playlists\"),\n put: (data) => this.#put(\"playlists\", data),\n },\n themes: {\n empty: () => undefined,\n get: () => this.#get(\"themes\"),\n put: (data) => this.#put(\"themes\", data),\n },\n tracks: {\n empty: () => undefined,\n get: () => this.#get(\"tracks\"),\n put: (data) => this.#put(\"tracks\", data),\n },\n });\n\n this.facets = this.#manager.facets;\n this.playlists = this.#manager.playlists;\n this.themes = this.#manager.themes;\n this.tracks = this.#manager.tracks;\n this.ready = () => true;\n }\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(\n `${this.nameWithGroup}${\n this.namespace.length ? \"/\" + this.namespace.replace(/\\/$/, \"\") : \"\"\n }`,\n {\n put: { strategy: \"replicate\", fn: this.#putIncoming },\n },\n );\n\n if (actions) {\n this.#put = this.#putOutgoing(actions.put);\n }\n }\n\n // Super\n super.connectedCallback();\n }\n\n // GET & PUT\n\n /** @param {string} name */\n #getProxy = (name) => this.proxy.get({ name: this.#cat(name) });\n #get = this.#getProxy;\n\n /** @param {string} name; @param {any} data */\n #putProxy = (name, data) => this.proxy.put({ name: this.#cat(name), data });\n #put = this.#putProxy;\n\n /**\n * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, name: string, data: any) => Promise<void>} action\n * @returns {(name: string, data: any) => Promise<void>}\n */\n #putOutgoing = (action) => async (name, data) => {\n return await action(this.uuid, name, data);\n };\n\n /**\n * @param {ReturnType<typeof crypto.randomUUID>} uuidSender\n * @param {string} name\n * @param {any} data\n */\n #putIncoming(uuidSender, name, data) {\n if (uuidSender === this.uuid) {\n // Initiator\n this.#putProxy(name, data);\n } else {\n // Listener\n if (name === \"facets\") this.#manager.signals.facets.value = data;\n if (name === \"playlists\") this.#manager.signals.playlists.value = data;\n if (name === \"themes\") this.#manager.signals.themes.value = data;\n if (name === \"tracks\") this.#manager.signals.tracks.value = data;\n }\n }\n\n // 🛠️\n\n get namespace() {\n return this.hasAttribute(\"namespace\")\n ? this.getAttribute(\"namespace\") + \"/\"\n : \"\";\n }\n\n /** @param {string} name */\n #cat(name) {\n return `${this.namespace}${name}`;\n }\n}\n\nexport default IndexedDBOutput;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = IndexedDBOutput;\nexport const NAME = \"dop-indexed-db\";\n\ncustomElements.define(NAME, IndexedDBOutput);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-WBRIGWBU.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-WM2QH5TD.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-WM2QH5TD.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-WM2QH5TD.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-WM2QH5TD.js.map
+348
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-XWZFJSX5.js
··· 1 + import { 2 + DiffuseElement, 3 + query, 4 + whenElementsDefined 5 + } from "./chunk-H46AZIKM.js"; 6 + import { 7 + computed, 8 + signal, 9 + untracked 10 + } from "./chunk-IZOBPV2S.js"; 11 + import { 12 + __name, 13 + init_Buffer, 14 + init_process 15 + } from "./chunk-FZQXS3RE.js"; 16 + 17 + // themes/webamp/browser/element.js 18 + init_Buffer(); 19 + init_process(); 20 + var ROW_HEIGHT = 14; 21 + var OVERSCAN = 20; 22 + var Browser = class extends DiffuseElement { 23 + static { 24 + __name(this, "Browser"); 25 + } 26 + constructor() { 27 + super(); 28 + this.attachShadow({ mode: "open" }); 29 + } 30 + // SIGNALS 31 + $output = signal( 32 + /** @type {OutputElement | undefined} */ 33 + void 0 34 + ); 35 + $provider = signal( 36 + /** @type {DiffuseElement & { tracks: SignalReader<Track[]> } | undefined} */ 37 + void 0 38 + ); 39 + $queue = signal( 40 + /** @type {import("@components/engine/queue/element.js").CLASS | undefined} */ 41 + void 0 42 + ); 43 + $scope = signal( 44 + /** @type {import("@components/engine/scope/element.js").CLASS | undefined} */ 45 + void 0 46 + ); 47 + $highlightedTrack = signal( 48 + /** @type {string | null} */ 49 + null 50 + ); 51 + $groupedPlaylists = computed(() => { 52 + const playlists = this.$output.value?.playlists.collection()?.sort((a, b) => a.name.localeCompare(b.name)); 53 + if (!playlists) return []; 54 + const ordered = playlists.filter((p) => !p.unordered); 55 + const unordered = playlists.filter((p) => p.unordered); 56 + return [ 57 + { label: "Ordered", playlists: ordered }, 58 + { label: "Unordered", playlists: unordered } 59 + ].filter((g) => g.playlists.length > 0); 60 + }); 61 + // STATE 62 + #scrollTop = 0; 63 + #viewportHeight = 0; 64 + #renderedStartIndex = -1; 65 + #renderedEndIndex = -1; 66 + /** @type {ResizeObserver | undefined} */ 67 + #resizeObserver; 68 + // LIFECYCLE 69 + /** 70 + * @override 71 + */ 72 + connectedCallback() { 73 + super.connectedCallback(); 74 + const output = query(this, "output-selector"); 75 + const provider = query(this, "tracks-selector"); 76 + const queue = query(this, "queue-engine-selector"); 77 + const scope = query(this, "scope-engine-selector"); 78 + whenElementsDefined({ output, provider, queue, scope }).then(() => { 79 + this.$output.value = output; 80 + this.$provider.value = provider; 81 + this.$queue.value = queue; 82 + this.$scope.value = scope; 83 + }); 84 + this.effect(() => { 85 + const _results = this.$provider.value?.tracks(); 86 + untracked(() => { 87 + const panel = this.root().querySelector(".sunken-panel"); 88 + if (panel) { 89 + panel.scrollTo(0, 0); 90 + this.#scrollTop = 0; 91 + } 92 + }); 93 + }); 94 + this.#setupScrollTracking(); 95 + this.effect(() => { 96 + const playlistId = this.$scope.value?.playlistId(); 97 + const select = this.root().querySelector("#playlist-select"); 98 + if (select) { 99 + select.value = playlistId ?? ""; 100 + } 101 + }); 102 + } 103 + /** 104 + * @override 105 + */ 106 + disconnectedCallback() { 107 + super.disconnectedCallback(); 108 + this.#resizeObserver?.disconnect(); 109 + } 110 + // SCROLL 111 + #setupScrollTracking() { 112 + requestAnimationFrame(() => { 113 + const panel = this.root().querySelector(".sunken-panel"); 114 + if (!panel) return; 115 + panel.addEventListener( 116 + "scroll", 117 + () => { 118 + this.#scrollTop = panel.scrollTop; 119 + this.#renderIfWindowChanged(panel); 120 + }, 121 + { passive: true } 122 + ); 123 + this.#resizeObserver = new ResizeObserver((entries) => { 124 + this.#viewportHeight = entries[0].contentRect.height; 125 + this.#renderIfWindowChanged(panel); 126 + }); 127 + this.#resizeObserver.observe(panel); 128 + }); 129 + } 130 + #computeWindow() { 131 + const startIndex = Math.max( 132 + 0, 133 + Math.floor(this.#scrollTop / ROW_HEIGHT) - OVERSCAN 134 + ); 135 + const visibleCount = Math.ceil(this.#viewportHeight / ROW_HEIGHT) + 2 * OVERSCAN; 136 + return { startIndex, endIndex: startIndex + visibleCount }; 137 + } 138 + /** 139 + * @param {Element} panel 140 + */ 141 + #renderIfWindowChanged(panel) { 142 + const { startIndex, endIndex } = this.#computeWindow(); 143 + if (startIndex === this.#renderedStartIndex && endIndex === this.#renderedEndIndex) { 144 + return; 145 + } 146 + const scrollTop = panel.scrollTop; 147 + this.forceRender(); 148 + panel.scrollTop = scrollTop; 149 + } 150 + // EVENTS 151 + /** 152 + * @param {Track} track 153 + */ 154 + playTrack(track) { 155 + this.$queue.value?.add({ 156 + inFront: true, 157 + tracks: [track] 158 + }); 159 + this.$queue.value?.shift(); 160 + } 161 + setSearchTerm = /* @__PURE__ */ __name(() => { 162 + const input = this.root().querySelector("#search-input"); 163 + const term = input?.value?.trim(); 164 + this.$scope.value?.setSearchTerm(term); 165 + }, "setSearchTerm"); 166 + /** 167 + * @param {Event} event 168 + */ 169 + setSelectedPlaylistId = /* @__PURE__ */ __name((event) => { 170 + const id = ( 171 + /** @type {HTMLSelectElement} */ 172 + event.currentTarget.value 173 + ); 174 + this.$scope.value?.setPlaylistId(id === "" ? void 0 : id); 175 + }, "setSelectedPlaylistId"); 176 + // RENDER 177 + /** 178 + * @param {RenderArg} _ 179 + */ 180 + render({ html }) { 181 + const highlighted = this.$highlightedTrack.value; 182 + const isLoading = this.$output.value?.tracks?.state() !== "loaded"; 183 + const tracks = this.$provider.value?.tracks() ?? []; 184 + const playlistId = this.$scope.value?.playlistId(); 185 + const totalTracks = tracks.length; 186 + const { startIndex, endIndex: rawEnd } = this.#computeWindow(); 187 + const endIndex = Math.min(totalTracks, rawEnd); 188 + this.#renderedStartIndex = startIndex; 189 + this.#renderedEndIndex = endIndex; 190 + const visibleTracks = tracks.slice(startIndex, endIndex); 191 + const totalHeight = totalTracks * ROW_HEIGHT; 192 + const topPad = startIndex * ROW_HEIGHT; 193 + return html` 194 + <link rel="stylesheet" href="styles/vendor/98.css" /> 195 + 196 + <style> 197 + @import "./themes/webamp/98-vars.css"; 198 + 199 + :host { 200 + display: flex; 201 + flex-direction: column; 202 + height: 100%; 203 + } 204 + 205 + /*********************************** 206 + * SEARCH 207 + ***********************************/ 208 + 209 + search { 210 + margin-bottom: var(--grouped-button-spacing); 211 + } 212 + 213 + search input { 214 + flex: 1; 215 + } 216 + 217 + search select { 218 + max-width: 33%; 219 + } 220 + 221 + /*********************************** 222 + * TABLE 223 + ***********************************/ 224 + 225 + .sunken-panel { 226 + flex: 1; 227 + min-height: 80px; 228 + } 229 + 230 + :host([resizable]) .sunken-panel { 231 + resize: both; 232 + } 233 + 234 + .virtual-header { 235 + position: sticky; 236 + top: 0; 237 + z-index: 1; 238 + } 239 + 240 + table { 241 + color: var(--text-color); 242 + table-layout: fixed; 243 + width: 100%; 244 + } 245 + 246 + table th { 247 + width: 30%; 248 + 249 + &:first-child { 250 + width: 40%; 251 + } 252 + } 253 + 254 + .virtual-scroll table { 255 + will-change: transform; 256 + } 257 + 258 + table tbody tr { 259 + cursor: pointer; 260 + } 261 + 262 + table td { 263 + overflow: hidden; 264 + text-overflow: ellipsis; 265 + } 266 + </style> 267 + 268 + <search class="field-row"> 269 + <label for="search-input">Search:</label> 270 + <input id="search-input" type="search" @change="${this.setSearchTerm}" /> 271 + <label for="playlist-select">Playlist:</label> 272 + <select id="playlist-select" @change="${this.setSelectedPlaylistId}"> 273 + <option value="" ?selected="${!playlistId || playlistId === ``}">All tracks</option> 274 + ${this.$groupedPlaylists().map( 275 + (group) => html` 276 + <optgroup label="${group.label}"> 277 + ${group.playlists.map( 278 + (p) => html` 279 + <option 280 + value="${p.id}" 281 + ?selected="${p.id === playlistId}" 282 + > 283 + ${p.name} 284 + </option> 285 + ` 286 + )} 287 + </optgroup> 288 + ` 289 + )} 290 + </select> 291 + </search> 292 + 293 + <div class="sunken-panel"> 294 + <table class="virtual-header"> 295 + <thead> 296 + <tr> 297 + <th>Title</th> 298 + <th>Artist</th> 299 + <th>Album</th> 300 + </tr> 301 + </thead> 302 + </table> 303 + <div class="virtual-scroll" style="height:${totalHeight}px"> 304 + <table style="transform:translateY(${topPad}px)"> 305 + <colgroup> 306 + <col style="width:40%"> 307 + <col style="width:30%"> 308 + <col style="width:30%"> 309 + </colgroup> 310 + <tbody> 311 + ${isLoading ? html` 312 + <tr> 313 + <td>Loading ...</td> 314 + <td></td> 315 + <td></td> 316 + </tr> 317 + ` : visibleTracks.map( 318 + (track) => html` 319 + <tr 320 + class="${highlighted === track.id ? `highlighted` : ``}" 321 + @click="${() => this.$highlightedTrack.value = track.id}" 322 + @dblclick="${() => this.playTrack(track)}" 323 + > 324 + <td>${track.tags?.title}</td> 325 + <td>${track.tags?.artist}</td> 326 + <td>${track.tags?.album}</td> 327 + </tr> 328 + ` 329 + )} 330 + </tbody> 331 + </table> 332 + </div> 333 + </div> 334 + `; 335 + } 336 + }; 337 + var element_default = Browser; 338 + var CLASS = Browser; 339 + var NAME = "dtw-browser"; 340 + customElements.define(NAME, CLASS); 341 + 342 + export { 343 + element_default, 344 + CLASS, 345 + NAME 346 + }; 347 + 348 + //# sourceMappingURL=./chunk-XWZFJSX5.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-XWZFJSX5.js.map
··· 1 + {"version":3,"sources":["/themes/webamp/browser/element.js"],"sourcesContent":["import {\n DiffuseElement,\n nothing,\n query,\n whenElementsDefined,\n} from \"@common/element.js\";\nimport { computed, signal, untracked } from \"@common/signal.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {SignalReader} from \"@common/signal.d.ts\";\n * @import {Track} from \"@definitions/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n */\n\nconst ROW_HEIGHT = 14;\nconst OVERSCAN = 20;\n\nclass Browser extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n // SIGNALS\n\n $output = signal(\n /** @type {OutputElement | undefined} */ (undefined),\n );\n\n $provider = signal(\n /** @type {DiffuseElement & { tracks: SignalReader<Track[]> } | undefined} */ (undefined),\n );\n\n $queue = signal(\n /** @type {import(\"@components/engine/queue/element.js\").CLASS | undefined} */ (undefined),\n );\n\n $scope = signal(\n /** @type {import(\"@components/engine/scope/element.js\").CLASS | undefined} */ (undefined),\n );\n\n $highlightedTrack = signal(/** @type {string | null} */ (null));\n\n $groupedPlaylists = computed(() => {\n const playlists = this.$output.value?.playlists.collection()\n ?.sort((a, b) => a.name.localeCompare(b.name));\n if (!playlists) return [];\n\n const ordered = playlists.filter((p) => !p.unordered);\n const unordered = playlists.filter((p) => p.unordered);\n\n return [\n { label: \"Ordered\", playlists: ordered },\n { label: \"Unordered\", playlists: unordered },\n ].filter((g) => g.playlists.length > 0);\n });\n\n // STATE\n\n #scrollTop = 0;\n #viewportHeight = 0;\n #renderedStartIndex = -1;\n #renderedEndIndex = -1;\n\n /** @type {ResizeObserver | undefined} */\n #resizeObserver;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n /** @type {OutputElement} */\n const output = query(this, \"output-selector\");\n\n /** @type {DiffuseElement & { tracks: SignalReader<Track[]> }} */\n const provider = query(this, \"tracks-selector\");\n\n /** @type {import(\"@components/engine/queue/element.js\").CLASS} */\n const queue = query(this, \"queue-engine-selector\");\n\n /** @type {import(\"@components/engine/scope/element.js\").CLASS} */\n const scope = query(this, \"scope-engine-selector\");\n\n // Wait for the above dependencies to be defined, then render again.\n whenElementsDefined({ output, provider, queue, scope }).then(() => {\n this.$output.value = output;\n this.$provider.value = provider;\n this.$queue.value = queue;\n this.$scope.value = scope;\n });\n\n // Effects\n this.effect(() => {\n const _results = this.$provider.value?.tracks();\n\n untracked(() => {\n const panel = this.root().querySelector(\".sunken-panel\");\n if (panel) {\n panel.scrollTo(0, 0);\n this.#scrollTop = 0;\n }\n });\n });\n\n // Scroll & resize tracking (set up once after first render)\n this.#setupScrollTracking();\n\n this.effect(() => {\n const playlistId = this.$scope.value?.playlistId();\n const select = this.root().querySelector(\"#playlist-select\");\n\n if (select) {\n /** @type {HTMLSelectElement} */ (select).value = playlistId ?? \"\";\n }\n });\n }\n\n /**\n * @override\n */\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#resizeObserver?.disconnect();\n }\n\n // SCROLL\n\n #setupScrollTracking() {\n requestAnimationFrame(() => {\n const panel = this.root().querySelector(\".sunken-panel\");\n if (!panel) return;\n\n panel.addEventListener(\n \"scroll\",\n () => {\n this.#scrollTop = panel.scrollTop;\n this.#renderIfWindowChanged(panel);\n },\n { passive: true },\n );\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n this.#viewportHeight = entries[0].contentRect.height;\n this.#renderIfWindowChanged(panel);\n });\n\n this.#resizeObserver.observe(panel);\n });\n }\n\n #computeWindow() {\n const startIndex = Math.max(\n 0,\n Math.floor(this.#scrollTop / ROW_HEIGHT) - OVERSCAN,\n );\n const visibleCount = Math.ceil(this.#viewportHeight / ROW_HEIGHT) +\n 2 * OVERSCAN;\n\n return { startIndex, endIndex: startIndex + visibleCount };\n }\n\n /**\n * @param {Element} panel\n */\n #renderIfWindowChanged(panel) {\n const { startIndex, endIndex } = this.#computeWindow();\n\n if (\n startIndex === this.#renderedStartIndex &&\n endIndex === this.#renderedEndIndex\n ) {\n return;\n }\n\n const scrollTop = panel.scrollTop;\n this.forceRender();\n panel.scrollTop = scrollTop;\n }\n\n // EVENTS\n\n /**\n * @param {Track} track\n */\n playTrack(track) {\n this.$queue.value?.add({\n inFront: true,\n tracks: [track],\n });\n\n this.$queue.value?.shift();\n }\n\n setSearchTerm = () => {\n /** @type {HTMLInputElement | null} */\n const input = this.root().querySelector(\"#search-input\");\n const term = input?.value?.trim();\n\n this.$scope.value?.setSearchTerm(term);\n };\n\n /**\n * @param {Event} event\n */\n setSelectedPlaylistId = (event) => {\n const id = /** @type {HTMLSelectElement} */ (event.currentTarget).value;\n\n this.$scope.value?.setPlaylistId(id === \"\" ? undefined : id);\n };\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n const highlighted = this.$highlightedTrack.value;\n const isLoading = this.$output.value?.tracks?.state() !== \"loaded\";\n const tracks = this.$provider.value?.tracks() ?? [];\n const playlistId = this.$scope.value?.playlistId();\n\n // Virtual list\n const totalTracks = tracks.length;\n const { startIndex, endIndex: rawEnd } = this.#computeWindow();\n const endIndex = Math.min(totalTracks, rawEnd);\n\n this.#renderedStartIndex = startIndex;\n this.#renderedEndIndex = endIndex;\n\n const visibleTracks = tracks.slice(startIndex, endIndex);\n const totalHeight = totalTracks * ROW_HEIGHT;\n const topPad = startIndex * ROW_HEIGHT;\n\n return html`\n <link rel=\"stylesheet\" href=\"styles/vendor/98.css\" />\n\n <style>\n @import \"./themes/webamp/98-vars.css\";\n\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n /***********************************\n * SEARCH\n ***********************************/\n\n search {\n margin-bottom: var(--grouped-button-spacing);\n }\n\n search input {\n flex: 1;\n }\n\n search select {\n max-width: 33%;\n }\n\n /***********************************\n * TABLE\n ***********************************/\n\n .sunken-panel {\n flex: 1;\n min-height: 80px;\n }\n\n :host([resizable]) .sunken-panel {\n resize: both;\n }\n\n .virtual-header {\n position: sticky;\n top: 0;\n z-index: 1;\n }\n\n table {\n color: var(--text-color);\n table-layout: fixed;\n width: 100%;\n }\n\n table th {\n width: 30%;\n\n &:first-child {\n width: 40%;\n }\n }\n\n .virtual-scroll table {\n will-change: transform;\n }\n\n table tbody tr {\n cursor: pointer;\n }\n\n table td {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n </style>\n\n <search class=\"field-row\">\n <label for=\"search-input\">Search:</label>\n <input id=\"search-input\" type=\"search\" @change=\"${this\n .setSearchTerm}\" />\n <label for=\"playlist-select\">Playlist:</label>\n <select id=\"playlist-select\" @change=\"${this.setSelectedPlaylistId}\">\n <option value=\"\" ?selected=\"${!playlistId ||\n playlistId === ``}\">All tracks</option>\n ${this.$groupedPlaylists().map((group) =>\n html`\n <optgroup label=\"${group.label}\">\n ${group.playlists.map((p) =>\n html`\n <option\n value=\"${p.id}\"\n ?selected=\"${p.id === playlistId}\"\n >\n ${p.name}\n </option>\n `\n )}\n </optgroup>\n `\n )}\n </select>\n </search>\n\n <div class=\"sunken-panel\">\n <table class=\"virtual-header\">\n <thead>\n <tr>\n <th>Title</th>\n <th>Artist</th>\n <th>Album</th>\n </tr>\n </thead>\n </table>\n <div class=\"virtual-scroll\" style=\"height:${totalHeight}px\">\n <table style=\"transform:translateY(${topPad}px)\">\n <colgroup>\n <col style=\"width:40%\">\n <col style=\"width:30%\">\n <col style=\"width:30%\">\n </colgroup>\n <tbody>\n ${isLoading\n ? html`\n <tr>\n <td>Loading ...</td>\n <td></td>\n <td></td>\n </tr>\n `\n : visibleTracks.map((track) =>\n html`\n <tr\n class=\"${highlighted === track.id ? `highlighted` : ``}\"\n @click=\"${() => this.$highlightedTrack.value = track.id}\"\n @dblclick=\"${() => this.playTrack(track)}\"\n >\n <td>${track.tags?.title}</td>\n <td>${track.tags?.artist}</td>\n <td>${track.tags?.album}</td>\n </tr>\n `\n )}\n </tbody>\n </table>\n </div>\n </div>\n `;\n }\n}\n\nexport default Browser;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = Browser;\nexport const NAME = \"dtw-browser\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-XWZFJSX5.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-XXGFKU7I.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-XXGFKU7I.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-XXGFKU7I.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-XXGFKU7I.js.map
+93
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-YGHHNA5S.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-H46AZIKM.js"; 4 + import { 5 + signal 6 + } from "./chunk-IZOBPV2S.js"; 7 + import { 8 + listen 9 + } from "./chunk-EJ2QF5QE.js"; 10 + import { 11 + __export, 12 + __name, 13 + init_Buffer, 14 + init_process 15 + } from "./chunk-FZQXS3RE.js"; 16 + 17 + // components/engine/queue/element.js 18 + var element_exports = {}; 19 + __export(element_exports, { 20 + CLASS: () => CLASS, 21 + NAME: () => NAME, 22 + default: () => element_default 23 + }); 24 + init_Buffer(); 25 + init_process(); 26 + var QueueEngine = class extends DiffuseElement { 27 + static { 28 + __name(this, "QueueEngine"); 29 + } 30 + static NAME = "diffuse/engine/queue"; 31 + static WORKER_URL = "components/engine/queue/worker.js"; 32 + constructor() { 33 + super(); 34 + this.proxy = this.workerProxy(); 35 + this.add = this.proxy.add; 36 + this.clear = this.proxy.clear; 37 + this.fill = this.proxy.fill; 38 + this.shift = this.proxy.shift; 39 + this.supply = this.proxy.supply; 40 + this.unshift = this.proxy.unshift; 41 + } 42 + // SIGNALS 43 + #future = signal( 44 + /** @type {Array<Item>} */ 45 + [] 46 + ); 47 + #now = signal( 48 + /** @type {Item | null} */ 49 + null 50 + ); 51 + #past = signal( 52 + /** @type {Array<Item>} */ 53 + [] 54 + ); 55 + #supplyFingerprint = signal( 56 + /** @type {string | undefined} */ 57 + void 0 58 + ); 59 + // STATE 60 + future = this.#future.get; 61 + now = this.#now.get; 62 + past = this.#past.get; 63 + supplyFingerprint = this.#supplyFingerprint.get; 64 + // LIFECYCLE 65 + /** 66 + * @override 67 + */ 68 + connectedCallback() { 69 + super.connectedCallback(); 70 + const link = this.workerLink(); 71 + listen("future", this.#future.set, link); 72 + listen("now", this.#now.set, link); 73 + listen("past", this.#past.set, link); 74 + listen("supplyFingerprint", this.#supplyFingerprint.set, link); 75 + this.proxy.future().then(this.#future.set); 76 + this.proxy.now().then(this.#now.set); 77 + this.proxy.past().then(this.#past.set); 78 + this.proxy.supplyFingerprint().then(this.#supplyFingerprint.set); 79 + } 80 + }; 81 + var element_default = QueueEngine; 82 + var CLASS = QueueEngine; 83 + var NAME = "de-queue"; 84 + customElements.define(NAME, QueueEngine); 85 + 86 + export { 87 + element_default, 88 + CLASS, 89 + NAME, 90 + element_exports 91 + }; 92 + 93 + //# sourceMappingURL=./chunk-YGHHNA5S.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-YGHHNA5S.js.map
··· 1 + {"version":3,"sources":["/components/engine/queue/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\nimport { listen } from \"@common/worker.js\";\n\n/**\n * @import {ProxiedActions} from \"@common/worker.d.ts\";\n * @import {Actions, Item, State} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<Actions>}\n */\nclass QueueEngine extends DiffuseElement {\n static NAME = \"diffuse/engine/queue\";\n static WORKER_URL = \"components/engine/queue/worker.js\";\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<Actions & State>} */\n this.proxy = this.workerProxy();\n\n this.add = this.proxy.add;\n this.clear = this.proxy.clear;\n this.fill = this.proxy.fill;\n this.shift = this.proxy.shift;\n this.supply = this.proxy.supply;\n this.unshift = this.proxy.unshift;\n }\n\n // SIGNALS\n\n #future = signal(/** @type {Array<Item>} */ ([]));\n #now = signal(/** @type {Item | null} */ (null));\n #past = signal(/** @type {Array<Item>} */ ([]));\n #supplyFingerprint = signal(/** @type {string | undefined} */ (undefined));\n\n // STATE\n\n future = this.#future.get;\n now = this.#now.get;\n past = this.#past.get;\n supplyFingerprint = this.#supplyFingerprint.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n // Sync data with worker\n const link = this.workerLink();\n\n // Listen for remote data changes\n listen(\"future\", this.#future.set, link);\n listen(\"now\", this.#now.set, link);\n listen(\"past\", this.#past.set, link);\n listen(\"supplyFingerprint\", this.#supplyFingerprint.set, link);\n\n // Fetch current data state\n this.proxy.future().then(this.#future.set);\n this.proxy.now().then(this.#now.set);\n this.proxy.past().then(this.#past.set);\n this.proxy.supplyFingerprint().then(this.#supplyFingerprint.set);\n }\n}\n\nexport default QueueEngine;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = QueueEngine;\nexport const NAME = \"de-queue\";\n\ncustomElements.define(NAME, QueueEngine);\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,IAAM,cAAN,cAA0B,eAAe;AAAA,EAhBzC,OAgByC;AAAA;AAAA;AAAA,EACvC,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,KAAK,YAAY;AAE9B,SAAK,MAAM,KAAK,MAAM;AACtB,SAAK,QAAQ,KAAK,MAAM;AACxB,SAAK,OAAO,KAAK,MAAM;AACvB,SAAK,QAAQ,KAAK,MAAM;AACxB,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,UAAU,KAAK,MAAM;AAAA,EAC5B;AAAA;AAAA,EAIA,UAAU;AAAA;AAAA,IAAmC,CAAC;AAAA,EAAE;AAAA,EAChD,OAAO;AAAA;AAAA,IAAmC;AAAA,EAAK;AAAA,EAC/C,QAAQ;AAAA;AAAA,IAAmC,CAAC;AAAA,EAAE;AAAA,EAC9C,qBAAqB;AAAA;AAAA,IAA0C;AAAA,EAAU;AAAA;AAAA,EAIzE,SAAS,KAAK,QAAQ;AAAA,EACtB,MAAM,KAAK,KAAK;AAAA,EAChB,OAAO,KAAK,MAAM;AAAA,EAClB,oBAAoB,KAAK,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5C,oBAAoB;AAClB,UAAM,kBAAkB;AAGxB,UAAM,OAAO,KAAK,WAAW;AAG7B,WAAO,UAAU,KAAK,QAAQ,KAAK,IAAI;AACvC,WAAO,OAAO,KAAK,KAAK,KAAK,IAAI;AACjC,WAAO,QAAQ,KAAK,MAAM,KAAK,IAAI;AACnC,WAAO,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAG7D,SAAK,MAAM,OAAO,EAAE,KAAK,KAAK,QAAQ,GAAG;AACzC,SAAK,MAAM,IAAI,EAAE,KAAK,KAAK,KAAK,GAAG;AACnC,SAAK,MAAM,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG;AACrC,SAAK,MAAM,kBAAkB,EAAE,KAAK,KAAK,mBAAmB,GAAG;AAAA,EACjE;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,WAAW;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-YGHHNA5S.js.map"}
+95
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-YMPAQN44.js
··· 1 + import { 2 + BroadcastableDiffuseElement, 3 + query 4 + } from "./chunk-H46AZIKM.js"; 5 + import { 6 + untracked 7 + } from "./chunk-IZOBPV2S.js"; 8 + import { 9 + __name, 10 + init_Buffer, 11 + init_process 12 + } from "./chunk-FZQXS3RE.js"; 13 + 14 + // components/orchestrator/queue-audio/element.js 15 + init_Buffer(); 16 + init_process(); 17 + var QueueAudioOrchestrator = class extends BroadcastableDiffuseElement { 18 + static { 19 + __name(this, "QueueAudioOrchestrator"); 20 + } 21 + static NAME = "diffuse/orchestrator/queue-audio"; 22 + // LIFE CYCLE 23 + /** 24 + * @override 25 + */ 26 + async connectedCallback() { 27 + if (this.hasAttribute("group")) { 28 + this.broadcast(this.nameWithGroup, {}); 29 + } 30 + super.connectedCallback(); 31 + this.input = query(this, "input-selector"); 32 + this.audio = query(this, "audio-engine-selector"); 33 + this.queue = query(this, "queue-engine-selector"); 34 + this.repeatShuffle = query(this, "repeat-shuffle-engine-selector"); 35 + await customElements.whenDefined(this.audio.localName); 36 + await customElements.whenDefined(this.input.localName); 37 + await customElements.whenDefined(this.queue.localName); 38 + await customElements.whenDefined(this.repeatShuffle.localName); 39 + this.effect(() => this.monitorActiveQueueItem()); 40 + this.effect(() => this.monitorAudioEnd()); 41 + } 42 + // 🛠️ 43 + async monitorActiveQueueItem() { 44 + if (!this.audio) return; 45 + if (!this.input) return; 46 + if (!this.queue) return; 47 + const activeTrack = this.queue.now(); 48 + if (await this.isLeader() === false) return; 49 + const isPlaying = untracked(this.audio.isPlaying); 50 + const resolvedUri = activeTrack ? await this.input.resolve({ method: "GET", uri: activeTrack.uri }) : void 0; 51 + if (resolvedUri && "stream" in resolvedUri) { 52 + throw new Error("Streams are not supported yet."); 53 + } 54 + const url = resolvedUri?.url; 55 + if (this.queue.now?.()?.id !== activeTrack?.id) return; 56 + this.audio.supply({ 57 + audio: activeTrack && url ? [{ 58 + id: activeTrack.id, 59 + isPreload: false, 60 + url 61 + }] : [], 62 + play: activeTrack && isPlaying ? { audioId: activeTrack.id } : void 0 63 + }); 64 + } 65 + async monitorAudioEnd() { 66 + if (!this.audio) return; 67 + if (!this.queue) return; 68 + const now = this.queue.now(); 69 + const aud = now ? this.audio.state(now.id) : void 0; 70 + if (aud?.hasEnded() && await this.isLeader()) { 71 + if (this.repeatShuffle?.repeat()) { 72 + const now2 = this.queue.now(); 73 + if (now2) { 74 + await this.queue.add({ 75 + inFront: true, 76 + tracks: [now2] 77 + }); 78 + } 79 + } 80 + await this.queue.shift(); 81 + } 82 + } 83 + }; 84 + var element_default = QueueAudioOrchestrator; 85 + var CLASS = QueueAudioOrchestrator; 86 + var NAME = "do-queue-audio"; 87 + customElements.define(NAME, QueueAudioOrchestrator); 88 + 89 + export { 90 + element_default, 91 + CLASS, 92 + NAME 93 + }; 94 + 95 + //# sourceMappingURL=./chunk-YMPAQN44.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-YMPAQN44.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/queue-audio/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement, query } from \"@common/element.js\";\nimport { untracked } from \"@common/signal.js\";\n\n/**\n * @import {InputElement} from \"@components/input/types.d.ts\"\n * @import RepeatShuffleEngine from \"@components/engine/repeat-shuffle/element.js\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * When the active queue item changes,\n * coordinate the audio engine accordingly.\n *\n * Vice versa, when the audio ends,\n * shift the queue if needed.\n */\nclass QueueAudioOrchestrator extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/orchestrator/queue-audio\";\n\n // LIFE CYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n this.broadcast(this.nameWithGroup, {});\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {InputElement} */\n this.input = query(this, \"input-selector\");\n\n /** @type {import(\"@components/engine/audio/element.js\").CLASS} */\n this.audio = query(this, \"audio-engine-selector\");\n\n /** @type {import(\"@components/engine/queue/element.js\").CLASS} */\n this.queue = query(this, \"queue-engine-selector\");\n\n /** @type {RepeatShuffleEngine} */\n this.repeatShuffle = query(this, \"repeat-shuffle-engine-selector\");\n\n // Wait until defined\n await customElements.whenDefined(this.audio.localName);\n await customElements.whenDefined(this.input.localName);\n await customElements.whenDefined(this.queue.localName);\n await customElements.whenDefined(this.repeatShuffle.localName);\n\n // Effects\n this.effect(() => this.monitorActiveQueueItem());\n this.effect(() => this.monitorAudioEnd());\n }\n\n // 🛠️\n\n async monitorActiveQueueItem() {\n if (!this.audio) return;\n if (!this.input) return;\n if (!this.queue) return;\n\n const activeTrack = this.queue.now();\n if ((await this.isLeader()) === false) return;\n\n const isPlaying = untracked(this.audio.isPlaying);\n\n // Resolve URIs\n const resolvedUri = activeTrack\n ? await this.input.resolve({ method: \"GET\", uri: activeTrack.uri })\n : undefined;\n\n if (resolvedUri && \"stream\" in resolvedUri) {\n throw new Error(\"Streams are not supported yet.\");\n }\n\n const url = resolvedUri?.url;\n\n // Check if we still need to render\n if (this.queue.now?.()?.id !== activeTrack?.id) return;\n\n // Play new active queue item\n // TODO: Take URL expiration timestamp into account\n // TODO: Preload next queue item\n this.audio.supply({\n audio: activeTrack && url\n ? [{\n id: activeTrack.id,\n isPreload: false,\n url,\n }]\n // TODO: Keep preloads\n : [],\n play: activeTrack && isPlaying ? { audioId: activeTrack.id } : undefined,\n });\n }\n\n async monitorAudioEnd() {\n if (!this.audio) return;\n if (!this.queue) return;\n\n const now = this.queue.now();\n const aud = now ? this.audio.state(now.id) : undefined;\n\n if (aud?.hasEnded() && (await this.isLeader())) {\n // TODO: Not sure yet if this is the best way to approach this.\n // The idea is that scrobblers would more easily pick this up,\n // as opposed to just resetting the audio.\n if (this.repeatShuffle?.repeat()) {\n const now = this.queue.now();\n if (now) {\n await this.queue.add({\n inFront: true,\n tracks: [now],\n });\n }\n }\n\n await this.queue.shift();\n }\n }\n}\n\nexport default QueueAudioOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = QueueAudioOrchestrator;\nexport const NAME = \"do-queue-audio\";\n\ncustomElements.define(NAME, QueueAudioOrchestrator);\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;AAmBA,IAAM,yBAAN,cAAqC,4BAA4B;AAAA,EAnBjE,OAmBiE;AAAA;AAAA;AAAA,EAC/D,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,MAAM,oBAAoB;AAExB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,WAAK,UAAU,KAAK,eAAe,CAAC,CAAC;AAAA,IACvC;AAGA,UAAM,kBAAkB;AAGxB,SAAK,QAAQ,MAAM,MAAM,gBAAgB;AAGzC,SAAK,QAAQ,MAAM,MAAM,uBAAuB;AAGhD,SAAK,QAAQ,MAAM,MAAM,uBAAuB;AAGhD,SAAK,gBAAgB,MAAM,MAAM,gCAAgC;AAGjE,UAAM,eAAe,YAAY,KAAK,MAAM,SAAS;AACrD,UAAM,eAAe,YAAY,KAAK,MAAM,SAAS;AACrD,UAAM,eAAe,YAAY,KAAK,MAAM,SAAS;AACrD,UAAM,eAAe,YAAY,KAAK,cAAc,SAAS;AAG7D,SAAK,OAAO,MAAM,KAAK,uBAAuB,CAAC;AAC/C,SAAK,OAAO,MAAM,KAAK,gBAAgB,CAAC;AAAA,EAC1C;AAAA;AAAA,EAIA,MAAM,yBAAyB;AAC7B,QAAI,CAAC,KAAK,MAAO;AACjB,QAAI,CAAC,KAAK,MAAO;AACjB,QAAI,CAAC,KAAK,MAAO;AAEjB,UAAM,cAAc,KAAK,MAAM,IAAI;AACnC,QAAK,MAAM,KAAK,SAAS,MAAO,MAAO;AAEvC,UAAM,YAAY,UAAU,KAAK,MAAM,SAAS;AAGhD,UAAM,cAAc,cAChB,MAAM,KAAK,MAAM,QAAQ,EAAE,QAAQ,OAAO,KAAK,YAAY,IAAI,CAAC,IAChE;AAEJ,QAAI,eAAe,YAAY,aAAa;AAC1C,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,MAAM,aAAa;AAGzB,QAAI,KAAK,MAAM,MAAM,GAAG,OAAO,aAAa,GAAI;AAKhD,SAAK,MAAM,OAAO;AAAA,MAChB,OAAO,eAAe,MAClB,CAAC;AAAA,QACD,IAAI,YAAY;AAAA,QAChB,WAAW;AAAA,QACX;AAAA,MACF,CAAC,IAEC,CAAC;AAAA,MACL,MAAM,eAAe,YAAY,EAAE,SAAS,YAAY,GAAG,IAAI;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB;AACtB,QAAI,CAAC,KAAK,MAAO;AACjB,QAAI,CAAC,KAAK,MAAO;AAEjB,UAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,UAAM,MAAM,MAAM,KAAK,MAAM,MAAM,IAAI,EAAE,IAAI;AAE7C,QAAI,KAAK,SAAS,KAAM,MAAM,KAAK,SAAS,GAAI;AAI9C,UAAI,KAAK,eAAe,OAAO,GAAG;AAChC,cAAMA,OAAM,KAAK,MAAM,IAAI;AAC3B,YAAIA,MAAK;AACP,gBAAM,KAAK,MAAM,IAAI;AAAA,YACnB,SAAS;AAAA,YACT,QAAQ,CAACA,IAAG;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,KAAK,MAAM,MAAM;AAAA,IACzB;AAAA,EACF;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,sBAAsB;","names":["now"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-YMPAQN44.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/cid.js
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/cid.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js.map
+31
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/element.js
··· 1 + import { 2 + A, 3 + BroadcastableDiffuseElement, 4 + DEFAULT_GROUP, 5 + DiffuseElement, 6 + T, 7 + component, 8 + query, 9 + queryOptional, 10 + terminateWorkers, 11 + whenElementsDefined 12 + } from "../chunk-H46AZIKM.js"; 13 + import "../chunk-G56PUJUJ.js"; 14 + import "../chunk-IZOBPV2S.js"; 15 + import "../chunk-EJ2QF5QE.js"; 16 + import "../chunk-NCFHYTLD.js"; 17 + import "../chunk-FZQXS3RE.js"; 18 + export { 19 + BroadcastableDiffuseElement, 20 + DEFAULT_GROUP, 21 + DiffuseElement, 22 + component, 23 + T as html, 24 + A as nothing, 25 + query, 26 + queryOptional, 27 + terminateWorkers, 28 + whenElementsDefined 29 + }; 30 + 31 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/element.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/element.js.map
+67
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/facets/foundation.js
··· 1 + import { 2 + GROUP, 3 + config, 4 + findExistingOrAdd, 5 + foundation_default 6 + } from "../../chunk-T6K5PZ3T.js"; 7 + import "../../chunk-M4NQYVPY.js"; 8 + import "../../chunk-4XYXC3TC.js"; 9 + import "../../chunk-CTVRRF4G.js"; 10 + import "../../chunk-IR27WFXT.js"; 11 + import "../../chunk-C7BSJ3AC.js"; 12 + import "../../chunk-CPS76EE2.js"; 13 + import "../../chunk-MA2JKS5M.js"; 14 + import "../../chunk-3SF5BNF4.js"; 15 + import "../../chunk-6YF7B6KW.js"; 16 + import "../../chunk-OIUQ2WMN.js"; 17 + import "../../chunk-DG4EBNDV.js"; 18 + import "../../chunk-R65OZ4FV.js"; 19 + import "../../chunk-3G4WUGDN.js"; 20 + import "../../chunk-P3M4HQTD.js"; 21 + import "../../chunk-NMCS5TQK.js"; 22 + import "../../chunk-OIQMICML.js"; 23 + import "../../chunk-UACRVUBF.js"; 24 + import "../../chunk-77ZY4GQV.js"; 25 + import "../../chunk-WBRIGWBU.js"; 26 + import "../../chunk-5UTOUDDD.js"; 27 + import "../../chunk-4MLZJ4ZD.js"; 28 + import "../../chunk-YMPAQN44.js"; 29 + import "../../chunk-U74YW6XS.js"; 30 + import "../../chunk-VK5BTHYP.js"; 31 + import "../../chunk-4EGXANKE.js"; 32 + import "../../chunk-AISBWLUT.js"; 33 + import "../../chunk-JBHW662S.js"; 34 + import "../../chunk-GX3WPNEX.js"; 35 + import "../../chunk-LSHUSEQ5.js"; 36 + import "../../chunk-SSTS6DW7.js"; 37 + import "../../chunk-HN4F5JEZ.js"; 38 + import "../../chunk-3VP55W4C.js"; 39 + import "../../chunk-ETCOFMH2.js"; 40 + import "../../chunk-GTZIAKZS.js"; 41 + import "../../chunk-AGNDISJF.js"; 42 + import "../../chunk-EEUCFWD4.js"; 43 + import "../../chunk-6DRHTH2U.js"; 44 + import "../../chunk-CW32SP4O.js"; 45 + import "../../chunk-VKEUU6QK.js"; 46 + import "../../chunk-EEVL24MR.js"; 47 + import "../../chunk-H4FCSW7J.js"; 48 + import "../../chunk-EXNT6GPY.js"; 49 + import "../../chunk-JZ7ERCQK.js"; 50 + import "../../chunk-NT5H3ES3.js"; 51 + import "../../chunk-YGHHNA5S.js"; 52 + import "../../chunk-H46AZIKM.js"; 53 + import "../../chunk-G56PUJUJ.js"; 54 + import "../../chunk-IZOBPV2S.js"; 55 + import "../../chunk-EJ2QF5QE.js"; 56 + import "../../chunk-NCFHYTLD.js"; 57 + import "../../chunk-DUCTMCPX.js"; 58 + import "../../chunk-UGE3FKYA.js"; 59 + import "../../chunk-FZQXS3RE.js"; 60 + export { 61 + GROUP, 62 + config, 63 + foundation_default as default, 64 + findExistingOrAdd 65 + }; 66 + 67 + //# sourceMappingURL=./foundation.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/facets/foundation.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/foundation.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/facets/utils.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/facets/utils.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/facets/utils.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/utils.js.map
+11
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/playlist.js
··· 1 + import { 2 + filterByPlaylist, 3 + match 4 + } from "../chunk-CW32SP4O.js"; 5 + import "../chunk-FZQXS3RE.js"; 6 + export { 7 + filterByPlaylist, 8 + match 9 + }; 10 + 11 + //# sourceMappingURL=./playlist.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/playlist.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/playlist.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/signal.js
··· 1 + ../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/common/signal.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/signal.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/signal.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/themes/utils.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/themes/utils.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/themes/utils.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/themes/utils.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/utils.js
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/utils.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/utils.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/utils.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/worker.js
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/worker.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/worker/rpc.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/worker/rpc.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/worker/rpc.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker/rpc.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/input/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-VKEUU6QK.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/input/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/input/worker.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/configurator/input/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/input/worker.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/configurator/input/worker.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/output-fallback/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-EXNT6GPY.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/output-fallback/element.js.map
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/configurator/output-fallback/element.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-H4FCSW7J.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/configurator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/output/element.js.map
+23
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/audio/element.js
··· 1 + import { 2 + AudioEngineItem, 3 + CLASS, 4 + NAME, 5 + NAME_ITEM, 6 + element_default 7 + } from "../../../chunk-JZ7ERCQK.js"; 8 + import "../../../chunk-NT5H3ES3.js"; 9 + import "../../../chunk-H46AZIKM.js"; 10 + import "../../../chunk-G56PUJUJ.js"; 11 + import "../../../chunk-IZOBPV2S.js"; 12 + import "../../../chunk-EJ2QF5QE.js"; 13 + import "../../../chunk-NCFHYTLD.js"; 14 + import "../../../chunk-FZQXS3RE.js"; 15 + export { 16 + AudioEngineItem, 17 + CLASS, 18 + NAME, 19 + NAME_ITEM, 20 + element_default as default 21 + }; 22 + 23 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/audio/element.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/queue/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-YGHHNA5S.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/queue/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/queue/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/queue/worker.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/engine/queue/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/queue/worker.js.map
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/engine/queue/worker.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/repeat-shuffle/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-3VP55W4C.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/repeat-shuffle/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/engine/repeat-shuffle/element.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/scope/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-ETCOFMH2.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/engine/scope/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/engine/scope/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/common.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/common.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/common.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/common.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/common.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/common.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/constants.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js.map
+20
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-LSHUSEQ5.js"; 6 + import "../../../chunk-SSTS6DW7.js"; 7 + import "../../../chunk-HN4F5JEZ.js"; 8 + import "../../../chunk-H46AZIKM.js"; 9 + import "../../../chunk-G56PUJUJ.js"; 10 + import "../../../chunk-IZOBPV2S.js"; 11 + import "../../../chunk-EJ2QF5QE.js"; 12 + import "../../../chunk-NCFHYTLD.js"; 13 + import "../../../chunk-FZQXS3RE.js"; 14 + export { 15 + CLASS, 16 + NAME, 17 + element_default as default 18 + }; 19 + 20 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/worker.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/input/https/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/https/worker.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/class.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/class.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/class.js.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/components/input/opensubsonic/class.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/common.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/common.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/common.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/constants.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/constants.js.map
+22
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-GTZIAKZS.js"; 6 + import "../../../chunk-AGNDISJF.js"; 7 + import "../../../chunk-EEUCFWD4.js"; 8 + import "../../../chunk-6DRHTH2U.js"; 9 + import "../../../chunk-EEVL24MR.js"; 10 + import "../../../chunk-H46AZIKM.js"; 11 + import "../../../chunk-G56PUJUJ.js"; 12 + import "../../../chunk-IZOBPV2S.js"; 13 + import "../../../chunk-EJ2QF5QE.js"; 14 + import "../../../chunk-NCFHYTLD.js"; 15 + import "../../../chunk-FZQXS3RE.js"; 16 + export { 17 + CLASS, 18 + NAME, 19 + element_default as default 20 + }; 21 + 22 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/worker.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/input/opensubsonic/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/opensubsonic/worker.js.map
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/input/opensubsonic/worker.js.map
+31
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/common.js
··· 1 + import { 2 + bucketId, 3 + bucketsFromTracks, 4 + buildURI, 5 + consultBucket, 6 + createClient, 7 + encodeAwsUriComponent, 8 + groupTracksByBucket, 9 + loadBuckets, 10 + parseURI, 11 + saveBuckets 12 + } from "../../../chunk-AISBWLUT.js"; 13 + import "../../../chunk-JBHW662S.js"; 14 + import "../../../chunk-GX3WPNEX.js"; 15 + import "../../../chunk-EEVL24MR.js"; 16 + import "../../../chunk-G56PUJUJ.js"; 17 + import "../../../chunk-FZQXS3RE.js"; 18 + export { 19 + bucketId, 20 + bucketsFromTracks, 21 + buildURI, 22 + consultBucket, 23 + createClient, 24 + encodeAwsUriComponent, 25 + groupTracksByBucket, 26 + loadBuckets, 27 + parseURI, 28 + saveBuckets 29 + }; 30 + 31 + //# sourceMappingURL=./common.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/common.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/s3/constants.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/constants.js.map
+22
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-4EGXANKE.js"; 6 + import "../../../chunk-AISBWLUT.js"; 7 + import "../../../chunk-JBHW662S.js"; 8 + import "../../../chunk-GX3WPNEX.js"; 9 + import "../../../chunk-EEVL24MR.js"; 10 + import "../../../chunk-H46AZIKM.js"; 11 + import "../../../chunk-G56PUJUJ.js"; 12 + import "../../../chunk-IZOBPV2S.js"; 13 + import "../../../chunk-EJ2QF5QE.js"; 14 + import "../../../chunk-NCFHYTLD.js"; 15 + import "../../../chunk-FZQXS3RE.js"; 16 + export { 17 + CLASS, 18 + NAME, 19 + element_default as default 20 + }; 21 + 22 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/element.js.map
+182
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/worker.js
··· 1 + import { 2 + detach, 3 + groupKeyHash, 4 + isAudioFile 5 + } from "../../../chunk-RG36R2PW.js"; 6 + import { 7 + bucketId, 8 + buildURI, 9 + consultBucket, 10 + createClient, 11 + groupTracksByBucket, 12 + parseURI 13 + } from "../../../chunk-AISBWLUT.js"; 14 + import "../../../chunk-JBHW662S.js"; 15 + import { 16 + SCHEME 17 + } from "../../../chunk-GX3WPNEX.js"; 18 + import "../../../chunk-EEVL24MR.js"; 19 + import "../../../chunk-G56PUJUJ.js"; 20 + import { 21 + ostiary, 22 + rpc 23 + } from "../../../chunk-EJ2QF5QE.js"; 24 + import "../../../chunk-NCFHYTLD.js"; 25 + import "../../../chunk-UGE3FKYA.js"; 26 + import { 27 + __name, 28 + init_Buffer, 29 + init_process 30 + } from "../../../chunk-FZQXS3RE.js"; 31 + 32 + // components/input/s3/worker.js 33 + init_Buffer(); 34 + init_process(); 35 + async function consult(fileUriOrScheme) { 36 + if (!fileUriOrScheme.includes(":")) { 37 + return { supported: true, consult: "undetermined" }; 38 + } 39 + const parsed = parseURI(fileUriOrScheme); 40 + if (!parsed) return { supported: true, consult: "undetermined" }; 41 + const consult2 = await consultBucket(parsed.bucket); 42 + return { supported: true, consult: consult2 }; 43 + } 44 + __name(consult, "consult"); 45 + async function detach2(args) { 46 + return detach({ 47 + ...args, 48 + inputScheme: SCHEME, 49 + handleFileUri: /* @__PURE__ */ __name(({ fileURI, tracks }) => { 50 + const result = parseURI(fileURI); 51 + if (!result) return tracks; 52 + const bid = bucketId(result.bucket); 53 + const groups = groupTracksByBucket(tracks); 54 + delete groups[bid]; 55 + return Object.values(groups).map((a) => a.tracks).flat(1); 56 + }, "handleFileUri") 57 + }); 58 + } 59 + __name(detach2, "detach"); 60 + async function groupConsult(tracks) { 61 + const groups = groupTracksByBucket(tracks); 62 + const promises = Object.entries(groups).map( 63 + async ([bucketId2, { bucket, tracks: tracks2 }]) => { 64 + const available = await consultBucket(bucket); 65 + const grouping = available ? { available, scheme: SCHEME, tracks: tracks2 } : { available, reason: "Bucket unavailable", scheme: SCHEME, tracks: tracks2 }; 66 + return { 67 + key: await groupKeyHash(SCHEME, bucketId2), 68 + grouping 69 + }; 70 + } 71 + ); 72 + const entries = (await Promise.all(promises)).map((entry) => [entry.key, entry.grouping]); 73 + return Object.fromEntries(entries); 74 + } 75 + __name(groupConsult, "groupConsult"); 76 + async function list(cachedTracks = []) { 77 + const cache = {}; 78 + const buckets = {}; 79 + cachedTracks.forEach((t) => { 80 + const parsed = parseURI(t.uri); 81 + if (!parsed) return; 82 + const bid = bucketId(parsed.bucket); 83 + buckets[bid] = parsed.bucket; 84 + if (cache[bid]) { 85 + cache[bid][parsed.path] = t; 86 + } else { 87 + cache[bid] = { [parsed.path]: t }; 88 + } 89 + }); 90 + const promises = Object.values(buckets).map(async (bucket) => { 91 + const client = createClient(bucket); 92 + const bid = bucketId(bucket); 93 + const list2 = await Array.fromAsync( 94 + client.listObjects({ 95 + prefix: bucket.path.replace(/^\//, "") 96 + }) 97 + ); 98 + let tracks2 = list2.filter((l) => isAudioFile(l.key)).map((l) => { 99 + const cachedTrack = cache[bid]?.[l.key]; 100 + const id = cachedTrack?.id || crypto.randomUUID(); 101 + const stats = cachedTrack?.stats; 102 + const tags = cachedTrack?.tags; 103 + const track = { 104 + $type: "sh.diffuse.output.track", 105 + id, 106 + stats, 107 + tags, 108 + uri: buildURI(bucket, l.key) 109 + }; 110 + return track; 111 + }); 112 + if (!tracks2.length) { 113 + tracks2 = [{ 114 + $type: "sh.diffuse.output.track", 115 + id: crypto.randomUUID(), 116 + kind: "placeholder", 117 + uri: buildURI(bucket) 118 + }]; 119 + } 120 + return tracks2; 121 + }); 122 + const tracks = (await Promise.all(promises)).flat(1); 123 + return tracks; 124 + } 125 + __name(list, "list"); 126 + async function resolve({ method, uri }) { 127 + const parsed = parseURI(uri); 128 + if (!parsed) return void 0; 129 + const expiresInSeconds = 60 * 60 * 24 * 7; 130 + const expiresAtSeconds = Math.round(Date.now() / 1e3) + expiresInSeconds; 131 + const client = createClient(parsed.bucket); 132 + const url = await client.getPresignedUrl( 133 + /** @type {any} */ 134 + method?.toUpperCase() ?? "GET", 135 + parsed.path 136 + ); 137 + return { expiresAt: expiresAtSeconds, url }; 138 + } 139 + __name(resolve, "resolve"); 140 + function demo() { 141 + const bucket = { 142 + accessKey: atob("QUtJQTZPUTNFVk1BWFZDRFFINkI="), 143 + bucketName: "ongaku-ryoho-demo", 144 + host: "s3.amazonaws.com", 145 + path: "/", 146 + region: "us-east-1", 147 + secretKey: atob("Z0hPQkdHRzU1aXc0a0RDbjdjWlRJYTVTUDRZWnpERkRzQnFCYWI4Mg==") 148 + }; 149 + const uri = buildURI(bucket); 150 + const track = { 151 + $type: "sh.diffuse.output.track", 152 + id: crypto.randomUUID(), 153 + kind: "placeholder", 154 + uri 155 + }; 156 + return { 157 + bucket, 158 + track 159 + }; 160 + } 161 + __name(demo, "demo"); 162 + ostiary((context) => { 163 + rpc(context, { 164 + consult, 165 + detach: detach2, 166 + groupConsult, 167 + list, 168 + resolve, 169 + // Additional actions 170 + demo 171 + }); 172 + }); 173 + export { 174 + consult, 175 + demo, 176 + detach2 as detach, 177 + groupConsult, 178 + list, 179 + resolve 180 + }; 181 + 182 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/worker.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/s3/worker.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/auto-queue/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-VK5BTHYP.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/auto-queue/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/orchestrator/auto-queue/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/favourites/common.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/common.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/favourites/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/common.js.map
+20
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/favourites/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-C7BSJ3AC.js"; 6 + import "../../../chunk-CPS76EE2.js"; 7 + import "../../../chunk-CW32SP4O.js"; 8 + import "../../../chunk-H46AZIKM.js"; 9 + import "../../../chunk-G56PUJUJ.js"; 10 + import "../../../chunk-IZOBPV2S.js"; 11 + import "../../../chunk-EJ2QF5QE.js"; 12 + import "../../../chunk-NCFHYTLD.js"; 13 + import "../../../chunk-FZQXS3RE.js"; 14 + export { 15 + CLASS, 16 + NAME, 17 + element_default as default 18 + }; 19 + 20 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/favourites/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/favourites/worker.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/favourites/worker.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/worker.js.map
+31
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/input/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-MA2JKS5M.js"; 6 + import "../../../chunk-4EGXANKE.js"; 7 + import "../../../chunk-AISBWLUT.js"; 8 + import "../../../chunk-JBHW662S.js"; 9 + import "../../../chunk-GX3WPNEX.js"; 10 + import "../../../chunk-LSHUSEQ5.js"; 11 + import "../../../chunk-SSTS6DW7.js"; 12 + import "../../../chunk-HN4F5JEZ.js"; 13 + import "../../../chunk-GTZIAKZS.js"; 14 + import "../../../chunk-AGNDISJF.js"; 15 + import "../../../chunk-EEUCFWD4.js"; 16 + import "../../../chunk-6DRHTH2U.js"; 17 + import "../../../chunk-VKEUU6QK.js"; 18 + import "../../../chunk-EEVL24MR.js"; 19 + import "../../../chunk-H46AZIKM.js"; 20 + import "../../../chunk-G56PUJUJ.js"; 21 + import "../../../chunk-IZOBPV2S.js"; 22 + import "../../../chunk-EJ2QF5QE.js"; 23 + import "../../../chunk-NCFHYTLD.js"; 24 + import "../../../chunk-FZQXS3RE.js"; 25 + export { 26 + CLASS, 27 + NAME, 28 + element_default as default 29 + }; 30 + 31 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/input/element.js.map
+35
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-3SF5BNF4.js"; 6 + import "../../../chunk-6YF7B6KW.js"; 7 + import "../../../chunk-OIUQ2WMN.js"; 8 + import "../../../chunk-DG4EBNDV.js"; 9 + import "../../../chunk-R65OZ4FV.js"; 10 + import "../../../chunk-3G4WUGDN.js"; 11 + import "../../../chunk-P3M4HQTD.js"; 12 + import "../../../chunk-NMCS5TQK.js"; 13 + import "../../../chunk-OIQMICML.js"; 14 + import "../../../chunk-UACRVUBF.js"; 15 + import "../../../chunk-77ZY4GQV.js"; 16 + import "../../../chunk-WBRIGWBU.js"; 17 + import "../../../chunk-5UTOUDDD.js"; 18 + import "../../../chunk-JBHW662S.js"; 19 + import "../../../chunk-H4FCSW7J.js"; 20 + import "../../../chunk-EXNT6GPY.js"; 21 + import "../../../chunk-H46AZIKM.js"; 22 + import "../../../chunk-G56PUJUJ.js"; 23 + import "../../../chunk-IZOBPV2S.js"; 24 + import "../../../chunk-EJ2QF5QE.js"; 25 + import "../../../chunk-NCFHYTLD.js"; 26 + import "../../../chunk-DUCTMCPX.js"; 27 + import "../../../chunk-UGE3FKYA.js"; 28 + import "../../../chunk-FZQXS3RE.js"; 29 + export { 30 + CLASS, 31 + NAME, 32 + element_default as default 33 + }; 34 + 35 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/output/element.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/process-tracks/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-4MLZJ4ZD.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/process-tracks/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/process-tracks/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/process-tracks/worker.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/orchestrator/process-tracks/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/process-tracks/worker.js.map
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/orchestrator/process-tracks/worker.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/queue-audio/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-YMPAQN44.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/queue-audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/queue-audio/element.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/scoped-tracks/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-IR27WFXT.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/scoped-tracks/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/orchestrator/scoped-tracks/element.js.map
+53
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/scoped-tracks/worker.js
··· 1 + import { 2 + filterByPlaylist 3 + } from "../../../chunk-CW32SP4O.js"; 4 + import { 5 + ostiary, 6 + rpc, 7 + workerProxy 8 + } from "../../../chunk-EJ2QF5QE.js"; 9 + import "../../../chunk-NCFHYTLD.js"; 10 + import { 11 + __name, 12 + init_Buffer, 13 + init_process 14 + } from "../../../chunk-FZQXS3RE.js"; 15 + 16 + // components/orchestrator/scoped-tracks/worker.js 17 + init_Buffer(); 18 + init_process(); 19 + async function supplyAvailable({ data, ports }) { 20 + const cachedTracks = data.filter((t) => t.kind !== "placeholder"); 21 + const input = workerProxy(() => ports.input); 22 + const search = workerProxy(() => ports.search); 23 + ports.input.start(); 24 + ports.search.start(); 25 + const groups = await input.groupConsult(cachedTracks); 26 + let availableTracks = []; 27 + Object.values(groups).forEach((value) => { 28 + if (value.available === false) return; 29 + availableTracks = availableTracks.concat(value.tracks); 30 + }, []); 31 + await search.supply({ tracks: availableTracks }); 32 + } 33 + __name(supplyAvailable, "supplyAvailable"); 34 + async function searchTracks({ data, ports }) { 35 + const search = workerProxy(() => ports.search); 36 + ports.search.start(); 37 + return await search.search(data); 38 + } 39 + __name(searchTracks, "searchTracks"); 40 + async function filterByPlaylist2({ data }) { 41 + return filterByPlaylist(data.tracks, data.playlist); 42 + } 43 + __name(filterByPlaylist2, "filterByPlaylist"); 44 + ostiary((context) => { 45 + rpc(context, { filterByPlaylist: filterByPlaylist2, searchTracks, supplyAvailable }); 46 + }); 47 + export { 48 + filterByPlaylist2 as filterByPlaylist, 49 + searchTracks, 50 + supplyAvailable 51 + }; 52 + 53 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/scoped-tracks/worker.js.map
··· 1 + {"version":3,"sources":["/worker.js"],"sourcesContent":["import { filterByPlaylist as filterByPlaylistFn } from \"@common/playlist.js\";\nimport { ostiary, rpc, workerProxy } from \"@common/worker.js\";\n\n/**\n * @import {Track} from \"@definitions/types.d.ts\"\n * @import {ActionsWithTunnel, ProxiedActions} from \"@common/worker.d.ts\"\n * @import {InputActions} from \"@components/input/types.d.ts\"\n * @import {Actions as SearchProcessorActions} from \"@components/processor/search/types.d.ts\"\n * @import {Actions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ACTIONS\n////////////////////////////////////////////\n\n/**\n * @type {ActionsWithTunnel<Actions>[\"supplyAvailable\"]}\n */\nexport async function supplyAvailable({ data, ports }) {\n const cachedTracks = data.filter((t) => t.kind !== \"placeholder\");\n\n /** @type {ProxiedActions<InputActions>} */\n const input = workerProxy(() => ports.input);\n\n /** @type {ProxiedActions<SearchProcessorActions>} */\n const search = workerProxy(() => ports.search);\n\n ports.input.start();\n ports.search.start();\n\n // Consult input\n const groups = await input.groupConsult(cachedTracks);\n\n /** @type {Track[]} */\n let availableTracks = [];\n\n Object.values(groups).forEach((value) => {\n if (value.available === false) return;\n availableTracks = availableTracks.concat(value.tracks);\n }, []);\n\n // Set pool\n await search.supply({ tracks: availableTracks });\n}\n\n/**\n * @type {ActionsWithTunnel<Actions>[\"searchTracks\"]}\n */\nexport async function searchTracks({ data, ports }) {\n /** @type {ProxiedActions<SearchProcessorActions>} */\n const search = workerProxy(() => ports.search);\n\n ports.search.start();\n\n return await search.search(data);\n}\n\n/**\n * @type {ActionsWithTunnel<Actions>[\"filterByPlaylist\"]}\n */\nexport async function filterByPlaylist({ data }) {\n return filterByPlaylistFn(data.tracks, data.playlist);\n}\n\n////////////////////////////////////////////\n// ⚡️\n////////////////////////////////////////////\n\nostiary((context) => {\n rpc(context, { filterByPlaylist, searchTracks, supplyAvailable });\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;AAkBA,eAAsB,gBAAgB,EAAE,MAAM,MAAM,GAAG;AACrD,QAAM,eAAe,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,aAAa;AAGhE,QAAM,QAAQ,YAAY,MAAM,MAAM,KAAK;AAG3C,QAAM,SAAS,YAAY,MAAM,MAAM,MAAM;AAE7C,QAAM,MAAM,MAAM;AAClB,QAAM,OAAO,MAAM;AAGnB,QAAM,SAAS,MAAM,MAAM,aAAa,YAAY;AAGpD,MAAI,kBAAkB,CAAC;AAEvB,SAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,UAAU;AACvC,QAAI,MAAM,cAAc,MAAO;AAC/B,sBAAkB,gBAAgB,OAAO,MAAM,MAAM;AAAA,EACvD,GAAG,CAAC,CAAC;AAGL,QAAM,OAAO,OAAO,EAAE,QAAQ,gBAAgB,CAAC;AACjD;AAzBsB;AA8BtB,eAAsB,aAAa,EAAE,MAAM,MAAM,GAAG;AAElD,QAAM,SAAS,YAAY,MAAM,MAAM,MAAM;AAE7C,QAAM,OAAO,MAAM;AAEnB,SAAO,MAAM,OAAO,OAAO,IAAI;AACjC;AAPsB;AAYtB,eAAsBA,kBAAiB,EAAE,KAAK,GAAG;AAC/C,SAAO,iBAAmB,KAAK,QAAQ,KAAK,QAAQ;AACtD;AAFsB,OAAAA,mBAAA;AAQtB,QAAQ,CAAC,YAAY;AACnB,MAAI,SAAS,EAAE,kBAAAA,mBAAkB,cAAc,gBAAgB,CAAC;AAClE,CAAC;","names":["filterByPlaylist"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/orchestrator/scoped-tracks/worker.js.map"}
+20
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/sources/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-U74YW6XS.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-DUCTMCPX.js"; 12 + import "../../../chunk-UGE3FKYA.js"; 13 + import "../../../chunk-FZQXS3RE.js"; 14 + export { 15 + CLASS, 16 + NAME, 17 + element_default as default 18 + }; 19 + 20 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/orchestrator/sources/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/sources/element.js.map
+1441
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/automerge-repo-server/element.js
··· 1 + import { 2 + F, 3 + Rt, 4 + St, 5 + it, 6 + jt, 7 + st 8 + } from "../../../../chunk-P3M4HQTD.js"; 9 + import { 10 + outputManager 11 + } from "../../../../chunk-5UTOUDDD.js"; 12 + import { 13 + DiffuseElement 14 + } from "../../../../chunk-H46AZIKM.js"; 15 + import "../../../../chunk-G56PUJUJ.js"; 16 + import "../../../../chunk-IZOBPV2S.js"; 17 + import "../../../../chunk-EJ2QF5QE.js"; 18 + import "../../../../chunk-NCFHYTLD.js"; 19 + import { 20 + __commonJS, 21 + __name, 22 + __toESM, 23 + init_Buffer, 24 + init_process 25 + } from "../../../../chunk-FZQXS3RE.js"; 26 + 27 + // node-modules-polyfills-empty:node:crypto 28 + var require_node_crypto = __commonJS({ 29 + "node-modules-polyfills-empty:node:crypto"(exports, module) { 30 + init_Buffer(); 31 + init_process(); 32 + module.exports = {}; 33 + } 34 + }); 35 + 36 + // components/output/bytes/automerge-repo-server/element.js 37 + init_Buffer(); 38 + init_process(); 39 + 40 + // https:https://jsr.io/@char/cbor/0.1.4/lib/mod.ts 41 + init_Buffer(); 42 + init_process(); 43 + 44 + // https:https://jsr.io/@char/cbor/0.1.4/lib/decode.ts 45 + init_Buffer(); 46 + init_process(); 47 + 48 + // https:https://jsr.io/@char/cbor/0.1.4/lib/u8.ts 49 + init_Buffer(); 50 + init_process(); 51 + function concat(arrays, size) { 52 + let written = 0; 53 + const len = arrays.length; 54 + let idx; 55 + if (size === void 0) { 56 + for (idx = size = 0; idx < len; idx++) { 57 + const chunk = arrays[idx]; 58 + size += chunk.byteLength; 59 + } 60 + } 61 + const buffer = new Uint8Array(size); 62 + for (idx = 0; idx < len; idx++) { 63 + const chunk = arrays[idx]; 64 + buffer.set(chunk, written); 65 + written += chunk.byteLength; 66 + } 67 + return buffer; 68 + } 69 + __name(concat, "concat"); 70 + var textEncoder = new TextEncoder(); 71 + var textDecoder = new TextDecoder(); 72 + function encodeUtf8Into(to, str, offset, length) { 73 + let buffer; 74 + if (offset === void 0) { 75 + buffer = to; 76 + } else if (length === void 0) { 77 + buffer = to.subarray(offset); 78 + } else { 79 + buffer = to.subarray(offset, offset + length); 80 + } 81 + const result = textEncoder.encodeInto(str, buffer); 82 + return result.written; 83 + } 84 + __name(encodeUtf8Into, "encodeUtf8Into"); 85 + function decodeUtf8From(from, offset, length) { 86 + let buffer; 87 + if (offset === void 0) { 88 + buffer = from; 89 + } else if (length === void 0) { 90 + buffer = from.subarray(offset); 91 + } else { 92 + buffer = from.subarray(offset, offset + length); 93 + } 94 + return textDecoder.decode(buffer); 95 + } 96 + __name(decodeUtf8From, "decodeUtf8From"); 97 + 98 + // https:https://jsr.io/@char/cbor/0.1.4/lib/decode.ts 99 + function readU16(ctx) { 100 + const v = ctx.view.getUint16(ctx.pos); 101 + ctx.pos += 2; 102 + return v; 103 + } 104 + __name(readU16, "readU16"); 105 + function readU32(ctx) { 106 + const v = ctx.view.getUint32(ctx.pos); 107 + ctx.pos += 4; 108 + return v; 109 + } 110 + __name(readU32, "readU32"); 111 + function readU53(ctx) { 112 + const hi = ctx.view.getUint32(ctx.pos); 113 + const lo = ctx.view.getUint32(ctx.pos + 4); 114 + ctx.pos += 8; 115 + return hi * 4294967296 + lo; 116 + } 117 + __name(readU53, "readU53"); 118 + function readArg(ctx, info) { 119 + if (info < 24) return info; 120 + switch (info) { 121 + case 24: 122 + return ctx.buf[ctx.pos++]; 123 + case 25: 124 + return readU16(ctx); 125 + case 26: 126 + return readU32(ctx); 127 + case 27: 128 + return readU53(ctx); 129 + default: 130 + throw new Error(`invalid argument encoding (${info})`); 131 + } 132 + } 133 + __name(readArg, "readArg"); 134 + function readF64(ctx) { 135 + const v = ctx.view.getFloat64(ctx.pos); 136 + ctx.pos += 8; 137 + return v; 138 + } 139 + __name(readF64, "readF64"); 140 + var fromCharCode = String.fromCharCode; 141 + function readString(ctx, length) { 142 + outer: do { 143 + if (length >= 16) break outer; 144 + if (length < 4) { 145 + if (length < 2) { 146 + if (length === 0) return ""; 147 + const a = ctx.buf[ctx.pos++]; 148 + if ((a & 128) !== 0) { 149 + ctx.pos -= 1; 150 + break outer; 151 + } 152 + return fromCharCode(a); 153 + } else { 154 + const a = ctx.buf[ctx.pos++]; 155 + const b = ctx.buf[ctx.pos++]; 156 + if ((a | b) & 128) { 157 + ctx.pos -= 2; 158 + break outer; 159 + } 160 + if (length < 3) return fromCharCode(a, b); 161 + const c = ctx.buf[ctx.pos++]; 162 + if (c & 128) { 163 + ctx.pos -= 3; 164 + break outer; 165 + } 166 + return fromCharCode(a, b, c); 167 + } 168 + } else { 169 + const a = ctx.buf[ctx.pos++]; 170 + const b = ctx.buf[ctx.pos++]; 171 + const c = ctx.buf[ctx.pos++]; 172 + const d = ctx.buf[ctx.pos++]; 173 + if ((a | b | c | d) & 128) { 174 + ctx.pos -= 4; 175 + break outer; 176 + } 177 + if (length < 6) { 178 + if (length === 4) return fromCharCode(a, b, c, d); 179 + const e = ctx.buf[ctx.pos++]; 180 + if ((a | b | c | d | e) & 128) { 181 + ctx.pos -= 5; 182 + break outer; 183 + } 184 + return fromCharCode(a, b, c, d, e); 185 + } else if (length < 8) { 186 + const e = ctx.buf[ctx.pos++]; 187 + const f = ctx.buf[ctx.pos++]; 188 + if ((a | b | c | d | e | f) & 128) { 189 + ctx.pos -= 6; 190 + break outer; 191 + } 192 + if (length < 7) return fromCharCode(a, b, c, d, e, f); 193 + const g = ctx.buf[ctx.pos++]; 194 + if ((a | b | c | d | e | f | g) & 128) { 195 + ctx.pos -= 7; 196 + break outer; 197 + } 198 + return fromCharCode(a, b, c, d, e, f, g); 199 + } else { 200 + const e = ctx.buf[ctx.pos++]; 201 + const f = ctx.buf[ctx.pos++]; 202 + const g = ctx.buf[ctx.pos++]; 203 + const h = ctx.buf[ctx.pos++]; 204 + if ((e | f | g | h) & 128) { 205 + ctx.pos -= 8; 206 + break outer; 207 + } 208 + if (length < 10) { 209 + if (length === 8) return fromCharCode(a, b, c, d, e, f, g, h); 210 + const i = ctx.buf[ctx.pos++]; 211 + if (i & 128) { 212 + ctx.pos -= 9; 213 + break outer; 214 + } 215 + return fromCharCode(a, b, c, d, e, f, g, h, i); 216 + } else if (length < 12) { 217 + const i = ctx.buf[ctx.pos++]; 218 + const j = ctx.buf[ctx.pos++]; 219 + if ((a | b | c | d | e | f | g | h | i | j) & 128) { 220 + ctx.pos -= 10; 221 + break outer; 222 + } 223 + if (length < 11) return fromCharCode(a, b, c, d, e, f, g, h, i, j); 224 + const k = ctx.buf[ctx.pos++]; 225 + if (k & 128) { 226 + ctx.pos -= 11; 227 + break outer; 228 + } 229 + return fromCharCode(a, b, c, d, e, f, g, h, i, j, k); 230 + } else { 231 + const i = ctx.buf[ctx.pos++]; 232 + const j = ctx.buf[ctx.pos++]; 233 + const k = ctx.buf[ctx.pos++]; 234 + const l = ctx.buf[ctx.pos++]; 235 + if ((i | j | k | l) & 128) { 236 + ctx.pos -= 12; 237 + break outer; 238 + } 239 + if (length < 14) { 240 + if (length === 12) return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l); 241 + const m = ctx.buf[ctx.pos++]; 242 + if ((m & 128) > 0) { 243 + ctx.pos -= 13; 244 + break outer; 245 + } 246 + return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m); 247 + } else { 248 + const m = ctx.buf[ctx.pos++]; 249 + const n = ctx.buf[ctx.pos++]; 250 + if ((m | n) & 128) { 251 + ctx.pos -= 14; 252 + break outer; 253 + } 254 + if (length < 15) return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n); 255 + const o = ctx.buf[ctx.pos++]; 256 + if (o & 128) { 257 + ctx.pos -= 15; 258 + break outer; 259 + } 260 + return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o); 261 + } 262 + } 263 + } 264 + } 265 + } while (false); 266 + const str = decodeUtf8From(ctx.buf, ctx.pos, length); 267 + ctx.pos += length; 268 + return str; 269 + } 270 + __name(readString, "readString"); 271 + function readBytes(ctx, length) { 272 + return ctx.buf.subarray(ctx.pos, ctx.pos += length); 273 + } 274 + __name(readBytes, "readBytes"); 275 + function readValue(ctx) { 276 + const header = ctx.buf[ctx.pos++]; 277 + const type = header >> 5; 278 + const info = header & 31; 279 + switch (type) { 280 + case 0: 281 + return readArg(ctx, info); 282 + case 1: 283 + return -1 - readArg(ctx, info); 284 + case 2: 285 + return readBytes(ctx, readArg(ctx, info)); 286 + case 3: 287 + return readString(ctx, readArg(ctx, info)); 288 + case 4: { 289 + const len = readArg(ctx, info); 290 + const arr = new Array(len); 291 + for (let i = 0; i < len; i++) arr[i] = readValue(ctx); 292 + return arr; 293 + } 294 + case 5: { 295 + const len = readArg(ctx, info); 296 + const obj = {}; 297 + for (let i = 0; i < len; i++) { 298 + const keyHeader = ctx.buf[ctx.pos++]; 299 + const keyType = keyHeader >> 5; 300 + const keyInfo = keyHeader & 31; 301 + if (keyType !== 3) throw new TypeError(`invalid map key type (${keyType}, ${keyInfo})`); 302 + const keyLen = readArg(ctx, keyInfo); 303 + const k = readString(ctx, keyLen); 304 + const v = readValue(ctx); 305 + if (k === "__proto__") { 306 + Reflect.defineProperty(obj, "__proto__", { 307 + enumerable: true, 308 + configurable: true, 309 + writable: true 310 + }); 311 + } 312 + obj[k] = v; 313 + } 314 + return obj; 315 + } 316 + case 7: { 317 + switch (info) { 318 + case 20: 319 + return false; 320 + case 21: 321 + return true; 322 + case 22: 323 + return null; 324 + case 23: 325 + return void 0; 326 + case 27: 327 + return readF64(ctx); 328 + default: 329 + throw new Error(`unknown simple value (${info})`); 330 + } 331 + } 332 + default: { 333 + throw new TypeError(`unknown type (${type}, ${info})`); 334 + } 335 + } 336 + } 337 + __name(readValue, "readValue"); 338 + function decodeCBOR(buf) { 339 + const ctx = { 340 + buf, 341 + view: new DataView(buf.buffer, buf.byteOffset, buf.byteLength), 342 + pos: 0 343 + }; 344 + return readValue(ctx); 345 + } 346 + __name(decodeCBOR, "decodeCBOR"); 347 + 348 + // https:https://jsr.io/@char/cbor/0.1.4/lib/encode.ts 349 + init_Buffer(); 350 + init_process(); 351 + var MAX_TYPE_ARG_LEN = 9; 352 + var CHUNK_SIZE = 1024; 353 + function resizeIfNeeded(ctx, needed) { 354 + if (ctx.pos + needed <= ctx.buf.byteLength) return; 355 + ctx.chunks.push(ctx.buf.subarray(0, ctx.pos)); 356 + ctx.len += ctx.pos; 357 + ctx.buf = new Uint8Array(needed < CHUNK_SIZE ? CHUNK_SIZE : needed); 358 + ctx.view = void 0; 359 + ctx.pos = 0; 360 + } 361 + __name(resizeIfNeeded, "resizeIfNeeded"); 362 + function writeU8(ctx, val) { 363 + ctx.buf[ctx.pos++] = val; 364 + } 365 + __name(writeU8, "writeU8"); 366 + function writeU16(ctx, val) { 367 + let pos = ctx.pos; 368 + const buf = ctx.buf; 369 + buf[pos++] = val >>> 8; 370 + buf[pos++] = val & 255; 371 + ctx.pos = pos; 372 + } 373 + __name(writeU16, "writeU16"); 374 + function writeU32(ctx, val) { 375 + let pos = ctx.pos; 376 + const buf = ctx.buf; 377 + buf[pos++] = val >>> 24; 378 + buf[pos++] = val >>> 16 & 255; 379 + buf[pos++] = val >>> 8 & 255; 380 + buf[pos++] = val & 255; 381 + ctx.pos = pos; 382 + } 383 + __name(writeU32, "writeU32"); 384 + function writeU53(ctx, val) { 385 + let pos = ctx.pos; 386 + const buf = ctx.buf; 387 + const hi = val / 4294967296 | 0; 388 + const lo = val >>> 0; 389 + buf[pos++] = hi >>> 24; 390 + buf[pos++] = hi >>> 16 & 255; 391 + buf[pos++] = hi >>> 8 & 255; 392 + buf[pos++] = hi & 255; 393 + buf[pos++] = lo >>> 24; 394 + buf[pos++] = lo >>> 16 & 255; 395 + buf[pos++] = lo >>> 8 & 255; 396 + buf[pos++] = lo & 255; 397 + ctx.pos = pos; 398 + } 399 + __name(writeU53, "writeU53"); 400 + function writeF64(ctx, val) { 401 + const buf = ctx.buf; 402 + const view = ctx.view ??= new DataView(buf.buffer, buf.byteOffset, buf.byteLength); 403 + view.setFloat64(ctx.pos, val); 404 + ctx.pos += 8; 405 + } 406 + __name(writeF64, "writeF64"); 407 + function writeTypeAndArg(ctx, type, arg) { 408 + if (arg < 24) { 409 + writeU8(ctx, type << 5 | arg); 410 + } else if (arg < 256) { 411 + writeU8(ctx, type << 5 | 24); 412 + writeU8(ctx, arg); 413 + } else if (arg < 65536) { 414 + writeU8(ctx, type << 5 | 25); 415 + writeU16(ctx, arg); 416 + } else if (arg < 4294967296) { 417 + writeU8(ctx, type << 5 | 26); 418 + writeU32(ctx, arg); 419 + } else { 420 + writeU8(ctx, type << 5 | 27); 421 + writeU53(ctx, arg); 422 + } 423 + } 424 + __name(writeTypeAndArg, "writeTypeAndArg"); 425 + function writeInt(ctx, val) { 426 + resizeIfNeeded(ctx, MAX_TYPE_ARG_LEN); 427 + if (val < 0) { 428 + writeTypeAndArg(ctx, 1, -val - 1); 429 + } else { 430 + writeTypeAndArg(ctx, 0, val); 431 + } 432 + } 433 + __name(writeInt, "writeInt"); 434 + function writeFloat(ctx, val) { 435 + resizeIfNeeded(ctx, MAX_TYPE_ARG_LEN); 436 + writeU8(ctx, 224 | 27); 437 + writeF64(ctx, val); 438 + } 439 + __name(writeFloat, "writeFloat"); 440 + function getHeaderSize(arg) { 441 + return arg < 24 ? 1 : arg < 256 ? 2 : arg < 65536 ? 3 : arg < 4294967296 ? 5 : 9; 442 + } 443 + __name(getHeaderSize, "getHeaderSize"); 444 + function writeString(ctx, val) { 445 + const strLength = val.length; 446 + if (strLength < 24 && ctx.buf.byteLength >= ctx.pos + strLength + 1) { 447 + outer: do { 448 + for (let i = 0, j = ctx.pos + 1; i < strLength; i++, j++) { 449 + const c = val.charCodeAt(i); 450 + if (c & 128) { 451 + break outer; 452 + } 453 + ctx.buf[j] = c; 454 + } 455 + ctx.buf[ctx.pos] = 96 | strLength; 456 + ctx.pos += strLength + 1; 457 + return; 458 + } while (false); 459 + } 460 + resizeIfNeeded(ctx, strLength * 3 + MAX_TYPE_ARG_LEN); 461 + const estimatedHeaderSize = getHeaderSize(strLength); 462 + const estimatedPosition = ctx.pos + estimatedHeaderSize; 463 + const realLen = encodeUtf8Into(ctx.buf, val, estimatedPosition); 464 + const headerSize = getHeaderSize(realLen); 465 + if (estimatedHeaderSize !== headerSize) { 466 + ctx.buf.copyWithin(ctx.pos + headerSize, estimatedPosition, estimatedPosition + realLen); 467 + } 468 + writeTypeAndArg(ctx, 3, realLen); 469 + ctx.pos += realLen; 470 + } 471 + __name(writeString, "writeString"); 472 + function writeBytes(ctx, buf) { 473 + const len = buf.byteLength; 474 + resizeIfNeeded(ctx, len + MAX_TYPE_ARG_LEN); 475 + writeTypeAndArg(ctx, 2, len); 476 + ctx.buf.set(buf, ctx.pos); 477 + ctx.pos += len; 478 + } 479 + __name(writeBytes, "writeBytes"); 480 + function writeValue(ctx, root) { 481 + const stack = [ 482 + root 483 + ]; 484 + let sp = 1; 485 + while (sp > 0) { 486 + const val = stack[--sp]; 487 + switch (typeof val) { 488 + case "boolean": { 489 + resizeIfNeeded(ctx, 1); 490 + writeU8(ctx, 244 + (val & 1)); 491 + break; 492 + } 493 + case "number": { 494 + if (Number.isSafeInteger(val)) writeInt(ctx, val); 495 + else writeFloat(ctx, val); 496 + break; 497 + } 498 + case "string": { 499 + writeString(ctx, val); 500 + break; 501 + } 502 + case "undefined": { 503 + resizeIfNeeded(ctx, 1); 504 + writeU8(ctx, 247); 505 + break; 506 + } 507 + // deno-lint-ignore no-fallthrough 508 + case "object": { 509 + if (val === null) { 510 + resizeIfNeeded(ctx, 1); 511 + writeU8(ctx, 246); 512 + break; 513 + } 514 + if (Array.isArray(val)) { 515 + const len = val.length; 516 + resizeIfNeeded(ctx, MAX_TYPE_ARG_LEN); 517 + writeTypeAndArg(ctx, 4, len); 518 + for (let idx = len - 1; idx >= 0; idx--) { 519 + stack[sp++] = val[idx]; 520 + } 521 + break; 522 + } 523 + if (val.constructor === Object) { 524 + let len = 0; 525 + const keys = Object.keys(val); 526 + for (let i = keys.length - 1; i >= 0; i--) { 527 + const k = keys[i]; 528 + const v = val[k]; 529 + if (v !== void 0) { 530 + stack[sp++] = v; 531 + stack[sp++] = k; 532 + len++; 533 + } 534 + } 535 + resizeIfNeeded(ctx, MAX_TYPE_ARG_LEN); 536 + writeTypeAndArg(ctx, 5, len); 537 + break; 538 + } 539 + if (val.constructor === Uint8Array) { 540 + writeBytes(ctx, val); 541 + break; 542 + } 543 + if ("toCBOR" in val) { 544 + stack[sp++] = val.toCBOR(); 545 + break; 546 + } 547 + if ("toJSON" in val) { 548 + stack[sp++] = val.toJSON(); 549 + break; 550 + } 551 + } 552 + default: { 553 + throw new TypeError(`unsupported type: ${typeof val} (${val?.constructor?.name})`); 554 + } 555 + } 556 + } 557 + } 558 + __name(writeValue, "writeValue"); 559 + function createContext() { 560 + return { 561 + chunks: [], 562 + buf: new Uint8Array(CHUNK_SIZE), 563 + view: void 0, 564 + pos: 0, 565 + len: 0 566 + }; 567 + } 568 + __name(createContext, "createContext"); 569 + var encodeCBOR = /* @__PURE__ */ __name((value) => { 570 + const ctx = createContext(); 571 + writeValue(ctx, value); 572 + ctx.chunks.push(ctx.buf.subarray(0, ctx.pos)); 573 + return concat(ctx.chunks, ctx.len + ctx.pos); 574 + }, "encodeCBOR"); 575 + 576 + // ../node_modules/.deno/bs58check@4.0.0/node_modules/bs58check/src/esm/index.js 577 + init_Buffer(); 578 + init_process(); 579 + 580 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js 581 + init_Buffer(); 582 + init_process(); 583 + 584 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js 585 + init_Buffer(); 586 + init_process(); 587 + 588 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js 589 + init_Buffer(); 590 + init_process(); 591 + 592 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js 593 + init_Buffer(); 594 + init_process(); 595 + 596 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/cryptoNode.js 597 + init_Buffer(); 598 + init_process(); 599 + var nc = __toESM(require_node_crypto()); 600 + var crypto2 = nc && typeof nc === "object" && "webcrypto" in nc ? nc.webcrypto : nc && typeof nc === "object" && "randomBytes" in nc ? nc : void 0; 601 + 602 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js 603 + function isBytes(a) { 604 + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; 605 + } 606 + __name(isBytes, "isBytes"); 607 + function abytes(b, ...lengths) { 608 + if (!isBytes(b)) 609 + throw new Error("Uint8Array expected"); 610 + if (lengths.length > 0 && !lengths.includes(b.length)) 611 + throw new Error("Uint8Array expected of length " + lengths + ", got length=" + b.length); 612 + } 613 + __name(abytes, "abytes"); 614 + function aexists(instance, checkFinished = true) { 615 + if (instance.destroyed) 616 + throw new Error("Hash instance has been destroyed"); 617 + if (checkFinished && instance.finished) 618 + throw new Error("Hash#digest() has already been called"); 619 + } 620 + __name(aexists, "aexists"); 621 + function aoutput(out, instance) { 622 + abytes(out); 623 + const min = instance.outputLen; 624 + if (out.length < min) { 625 + throw new Error("digestInto() expects output buffer of length at least " + min); 626 + } 627 + } 628 + __name(aoutput, "aoutput"); 629 + function clean(...arrays) { 630 + for (let i = 0; i < arrays.length; i++) { 631 + arrays[i].fill(0); 632 + } 633 + } 634 + __name(clean, "clean"); 635 + function createView(arr) { 636 + return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); 637 + } 638 + __name(createView, "createView"); 639 + function rotr(word, shift) { 640 + return word << 32 - shift | word >>> shift; 641 + } 642 + __name(rotr, "rotr"); 643 + function utf8ToBytes(str) { 644 + if (typeof str !== "string") 645 + throw new Error("string expected"); 646 + return new Uint8Array(new TextEncoder().encode(str)); 647 + } 648 + __name(utf8ToBytes, "utf8ToBytes"); 649 + function toBytes(data) { 650 + if (typeof data === "string") 651 + data = utf8ToBytes(data); 652 + abytes(data); 653 + return data; 654 + } 655 + __name(toBytes, "toBytes"); 656 + var Hash = class { 657 + static { 658 + __name(this, "Hash"); 659 + } 660 + }; 661 + function createHasher(hashCons) { 662 + const hashC = /* @__PURE__ */ __name((msg) => hashCons().update(toBytes(msg)).digest(), "hashC"); 663 + const tmp = hashCons(); 664 + hashC.outputLen = tmp.outputLen; 665 + hashC.blockLen = tmp.blockLen; 666 + hashC.create = () => hashCons(); 667 + return hashC; 668 + } 669 + __name(createHasher, "createHasher"); 670 + 671 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js 672 + function setBigUint64(view, byteOffset, value, isLE) { 673 + if (typeof view.setBigUint64 === "function") 674 + return view.setBigUint64(byteOffset, value, isLE); 675 + const _32n = BigInt(32); 676 + const _u32_max = BigInt(4294967295); 677 + const wh = Number(value >> _32n & _u32_max); 678 + const wl = Number(value & _u32_max); 679 + const h = isLE ? 4 : 0; 680 + const l = isLE ? 0 : 4; 681 + view.setUint32(byteOffset + h, wh, isLE); 682 + view.setUint32(byteOffset + l, wl, isLE); 683 + } 684 + __name(setBigUint64, "setBigUint64"); 685 + function Chi(a, b, c) { 686 + return a & b ^ ~a & c; 687 + } 688 + __name(Chi, "Chi"); 689 + function Maj(a, b, c) { 690 + return a & b ^ a & c ^ b & c; 691 + } 692 + __name(Maj, "Maj"); 693 + var HashMD = class extends Hash { 694 + static { 695 + __name(this, "HashMD"); 696 + } 697 + constructor(blockLen, outputLen, padOffset, isLE) { 698 + super(); 699 + this.finished = false; 700 + this.length = 0; 701 + this.pos = 0; 702 + this.destroyed = false; 703 + this.blockLen = blockLen; 704 + this.outputLen = outputLen; 705 + this.padOffset = padOffset; 706 + this.isLE = isLE; 707 + this.buffer = new Uint8Array(blockLen); 708 + this.view = createView(this.buffer); 709 + } 710 + update(data) { 711 + aexists(this); 712 + data = toBytes(data); 713 + abytes(data); 714 + const { view, buffer, blockLen } = this; 715 + const len = data.length; 716 + for (let pos = 0; pos < len; ) { 717 + const take = Math.min(blockLen - this.pos, len - pos); 718 + if (take === blockLen) { 719 + const dataView = createView(data); 720 + for (; blockLen <= len - pos; pos += blockLen) 721 + this.process(dataView, pos); 722 + continue; 723 + } 724 + buffer.set(data.subarray(pos, pos + take), this.pos); 725 + this.pos += take; 726 + pos += take; 727 + if (this.pos === blockLen) { 728 + this.process(view, 0); 729 + this.pos = 0; 730 + } 731 + } 732 + this.length += data.length; 733 + this.roundClean(); 734 + return this; 735 + } 736 + digestInto(out) { 737 + aexists(this); 738 + aoutput(out, this); 739 + this.finished = true; 740 + const { buffer, view, blockLen, isLE } = this; 741 + let { pos } = this; 742 + buffer[pos++] = 128; 743 + clean(this.buffer.subarray(pos)); 744 + if (this.padOffset > blockLen - pos) { 745 + this.process(view, 0); 746 + pos = 0; 747 + } 748 + for (let i = pos; i < blockLen; i++) 749 + buffer[i] = 0; 750 + setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE); 751 + this.process(view, 0); 752 + const oview = createView(out); 753 + const len = this.outputLen; 754 + if (len % 4) 755 + throw new Error("_sha2: outputLen should be aligned to 32bit"); 756 + const outLen = len / 4; 757 + const state = this.get(); 758 + if (outLen > state.length) 759 + throw new Error("_sha2: outputLen bigger than state"); 760 + for (let i = 0; i < outLen; i++) 761 + oview.setUint32(4 * i, state[i], isLE); 762 + } 763 + digest() { 764 + const { buffer, outputLen } = this; 765 + this.digestInto(buffer); 766 + const res = buffer.slice(0, outputLen); 767 + this.destroy(); 768 + return res; 769 + } 770 + _cloneInto(to) { 771 + to || (to = new this.constructor()); 772 + to.set(...this.get()); 773 + const { blockLen, buffer, length, finished, destroyed, pos } = this; 774 + to.destroyed = destroyed; 775 + to.finished = finished; 776 + to.length = length; 777 + to.pos = pos; 778 + if (length % blockLen) 779 + to.buffer.set(buffer); 780 + return to; 781 + } 782 + clone() { 783 + return this._cloneInto(); 784 + } 785 + }; 786 + var SHA256_IV = /* @__PURE__ */ Uint32Array.from([ 787 + 1779033703, 788 + 3144134277, 789 + 1013904242, 790 + 2773480762, 791 + 1359893119, 792 + 2600822924, 793 + 528734635, 794 + 1541459225 795 + ]); 796 + 797 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_u64.js 798 + init_Buffer(); 799 + init_process(); 800 + var U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1); 801 + 802 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js 803 + var SHA256_K = /* @__PURE__ */ Uint32Array.from([ 804 + 1116352408, 805 + 1899447441, 806 + 3049323471, 807 + 3921009573, 808 + 961987163, 809 + 1508970993, 810 + 2453635748, 811 + 2870763221, 812 + 3624381080, 813 + 310598401, 814 + 607225278, 815 + 1426881987, 816 + 1925078388, 817 + 2162078206, 818 + 2614888103, 819 + 3248222580, 820 + 3835390401, 821 + 4022224774, 822 + 264347078, 823 + 604807628, 824 + 770255983, 825 + 1249150122, 826 + 1555081692, 827 + 1996064986, 828 + 2554220882, 829 + 2821834349, 830 + 2952996808, 831 + 3210313671, 832 + 3336571891, 833 + 3584528711, 834 + 113926993, 835 + 338241895, 836 + 666307205, 837 + 773529912, 838 + 1294757372, 839 + 1396182291, 840 + 1695183700, 841 + 1986661051, 842 + 2177026350, 843 + 2456956037, 844 + 2730485921, 845 + 2820302411, 846 + 3259730800, 847 + 3345764771, 848 + 3516065817, 849 + 3600352804, 850 + 4094571909, 851 + 275423344, 852 + 430227734, 853 + 506948616, 854 + 659060556, 855 + 883997877, 856 + 958139571, 857 + 1322822218, 858 + 1537002063, 859 + 1747873779, 860 + 1955562222, 861 + 2024104815, 862 + 2227730452, 863 + 2361852424, 864 + 2428436474, 865 + 2756734187, 866 + 3204031479, 867 + 3329325298 868 + ]); 869 + var SHA256_W = /* @__PURE__ */ new Uint32Array(64); 870 + var SHA256 = class extends HashMD { 871 + static { 872 + __name(this, "SHA256"); 873 + } 874 + constructor(outputLen = 32) { 875 + super(64, outputLen, 8, false); 876 + this.A = SHA256_IV[0] | 0; 877 + this.B = SHA256_IV[1] | 0; 878 + this.C = SHA256_IV[2] | 0; 879 + this.D = SHA256_IV[3] | 0; 880 + this.E = SHA256_IV[4] | 0; 881 + this.F = SHA256_IV[5] | 0; 882 + this.G = SHA256_IV[6] | 0; 883 + this.H = SHA256_IV[7] | 0; 884 + } 885 + get() { 886 + const { A, B, C, D, E, F: F2, G, H } = this; 887 + return [A, B, C, D, E, F2, G, H]; 888 + } 889 + // prettier-ignore 890 + set(A, B, C, D, E, F2, G, H) { 891 + this.A = A | 0; 892 + this.B = B | 0; 893 + this.C = C | 0; 894 + this.D = D | 0; 895 + this.E = E | 0; 896 + this.F = F2 | 0; 897 + this.G = G | 0; 898 + this.H = H | 0; 899 + } 900 + process(view, offset) { 901 + for (let i = 0; i < 16; i++, offset += 4) 902 + SHA256_W[i] = view.getUint32(offset, false); 903 + for (let i = 16; i < 64; i++) { 904 + const W15 = SHA256_W[i - 15]; 905 + const W2 = SHA256_W[i - 2]; 906 + const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3; 907 + const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10; 908 + SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0; 909 + } 910 + let { A, B, C, D, E, F: F2, G, H } = this; 911 + for (let i = 0; i < 64; i++) { 912 + const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25); 913 + const T1 = H + sigma1 + Chi(E, F2, G) + SHA256_K[i] + SHA256_W[i] | 0; 914 + const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22); 915 + const T2 = sigma0 + Maj(A, B, C) | 0; 916 + H = G; 917 + G = F2; 918 + F2 = E; 919 + E = D + T1 | 0; 920 + D = C; 921 + C = B; 922 + B = A; 923 + A = T1 + T2 | 0; 924 + } 925 + A = A + this.A | 0; 926 + B = B + this.B | 0; 927 + C = C + this.C | 0; 928 + D = D + this.D | 0; 929 + E = E + this.E | 0; 930 + F2 = F2 + this.F | 0; 931 + G = G + this.G | 0; 932 + H = H + this.H | 0; 933 + this.set(A, B, C, D, E, F2, G, H); 934 + } 935 + roundClean() { 936 + clean(SHA256_W); 937 + } 938 + destroy() { 939 + this.set(0, 0, 0, 0, 0, 0, 0, 0); 940 + clean(this.buffer); 941 + } 942 + }; 943 + var sha256 = /* @__PURE__ */ createHasher(() => new SHA256()); 944 + 945 + // ../node_modules/.deno/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js 946 + var sha2562 = sha256; 947 + 948 + // ../node_modules/.deno/bs58check@4.0.0/node_modules/bs58check/src/esm/base.js 949 + init_Buffer(); 950 + init_process(); 951 + 952 + // ../node_modules/.deno/bs58@6.0.0/node_modules/bs58/src/esm/index.js 953 + init_Buffer(); 954 + init_process(); 955 + 956 + // ../node_modules/.deno/base-x@5.0.1/node_modules/base-x/src/esm/index.js 957 + init_Buffer(); 958 + init_process(); 959 + function base(ALPHABET2) { 960 + if (ALPHABET2.length >= 255) { 961 + throw new TypeError("Alphabet too long"); 962 + } 963 + const BASE_MAP = new Uint8Array(256); 964 + for (let j = 0; j < BASE_MAP.length; j++) { 965 + BASE_MAP[j] = 255; 966 + } 967 + for (let i = 0; i < ALPHABET2.length; i++) { 968 + const x = ALPHABET2.charAt(i); 969 + const xc = x.charCodeAt(0); 970 + if (BASE_MAP[xc] !== 255) { 971 + throw new TypeError(x + " is ambiguous"); 972 + } 973 + BASE_MAP[xc] = i; 974 + } 975 + const BASE = ALPHABET2.length; 976 + const LEADER = ALPHABET2.charAt(0); 977 + const FACTOR = Math.log(BASE) / Math.log(256); 978 + const iFACTOR = Math.log(256) / Math.log(BASE); 979 + function encode(source) { 980 + if (source instanceof Uint8Array) { 981 + } else if (ArrayBuffer.isView(source)) { 982 + source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength); 983 + } else if (Array.isArray(source)) { 984 + source = Uint8Array.from(source); 985 + } 986 + if (!(source instanceof Uint8Array)) { 987 + throw new TypeError("Expected Uint8Array"); 988 + } 989 + if (source.length === 0) { 990 + return ""; 991 + } 992 + let zeroes = 0; 993 + let length = 0; 994 + let pbegin = 0; 995 + const pend = source.length; 996 + while (pbegin !== pend && source[pbegin] === 0) { 997 + pbegin++; 998 + zeroes++; 999 + } 1000 + const size = (pend - pbegin) * iFACTOR + 1 >>> 0; 1001 + const b58 = new Uint8Array(size); 1002 + while (pbegin !== pend) { 1003 + let carry = source[pbegin]; 1004 + let i = 0; 1005 + for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) { 1006 + carry += 256 * b58[it1] >>> 0; 1007 + b58[it1] = carry % BASE >>> 0; 1008 + carry = carry / BASE >>> 0; 1009 + } 1010 + if (carry !== 0) { 1011 + throw new Error("Non-zero carry"); 1012 + } 1013 + length = i; 1014 + pbegin++; 1015 + } 1016 + let it2 = size - length; 1017 + while (it2 !== size && b58[it2] === 0) { 1018 + it2++; 1019 + } 1020 + let str = LEADER.repeat(zeroes); 1021 + for (; it2 < size; ++it2) { 1022 + str += ALPHABET2.charAt(b58[it2]); 1023 + } 1024 + return str; 1025 + } 1026 + __name(encode, "encode"); 1027 + function decodeUnsafe(source) { 1028 + if (typeof source !== "string") { 1029 + throw new TypeError("Expected String"); 1030 + } 1031 + if (source.length === 0) { 1032 + return new Uint8Array(); 1033 + } 1034 + let psz = 0; 1035 + let zeroes = 0; 1036 + let length = 0; 1037 + while (source[psz] === LEADER) { 1038 + zeroes++; 1039 + psz++; 1040 + } 1041 + const size = (source.length - psz) * FACTOR + 1 >>> 0; 1042 + const b256 = new Uint8Array(size); 1043 + while (psz < source.length) { 1044 + const charCode = source.charCodeAt(psz); 1045 + if (charCode > 255) { 1046 + return; 1047 + } 1048 + let carry = BASE_MAP[charCode]; 1049 + if (carry === 255) { 1050 + return; 1051 + } 1052 + let i = 0; 1053 + for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) { 1054 + carry += BASE * b256[it3] >>> 0; 1055 + b256[it3] = carry % 256 >>> 0; 1056 + carry = carry / 256 >>> 0; 1057 + } 1058 + if (carry !== 0) { 1059 + throw new Error("Non-zero carry"); 1060 + } 1061 + length = i; 1062 + psz++; 1063 + } 1064 + let it4 = size - length; 1065 + while (it4 !== size && b256[it4] === 0) { 1066 + it4++; 1067 + } 1068 + const vch = new Uint8Array(zeroes + (size - it4)); 1069 + let j = zeroes; 1070 + while (it4 !== size) { 1071 + vch[j++] = b256[it4++]; 1072 + } 1073 + return vch; 1074 + } 1075 + __name(decodeUnsafe, "decodeUnsafe"); 1076 + function decode(string) { 1077 + const buffer = decodeUnsafe(string); 1078 + if (buffer) { 1079 + return buffer; 1080 + } 1081 + throw new Error("Non-base" + BASE + " character"); 1082 + } 1083 + __name(decode, "decode"); 1084 + return { 1085 + encode, 1086 + decodeUnsafe, 1087 + decode 1088 + }; 1089 + } 1090 + __name(base, "base"); 1091 + var esm_default = base; 1092 + 1093 + // ../node_modules/.deno/bs58@6.0.0/node_modules/bs58/src/esm/index.js 1094 + var ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; 1095 + var esm_default2 = esm_default(ALPHABET); 1096 + 1097 + // ../node_modules/.deno/bs58check@4.0.0/node_modules/bs58check/src/esm/base.js 1098 + function base_default(checksumFn) { 1099 + function encode(payload) { 1100 + var payloadU8 = Uint8Array.from(payload); 1101 + var checksum = checksumFn(payloadU8); 1102 + var length = payloadU8.length + 4; 1103 + var both = new Uint8Array(length); 1104 + both.set(payloadU8, 0); 1105 + both.set(checksum.subarray(0, 4), payloadU8.length); 1106 + return esm_default2.encode(both); 1107 + } 1108 + __name(encode, "encode"); 1109 + function decodeRaw(buffer) { 1110 + var payload = buffer.slice(0, -4); 1111 + var checksum = buffer.slice(-4); 1112 + var newChecksum = checksumFn(payload); 1113 + if (checksum[0] ^ newChecksum[0] | checksum[1] ^ newChecksum[1] | checksum[2] ^ newChecksum[2] | checksum[3] ^ newChecksum[3]) 1114 + return; 1115 + return payload; 1116 + } 1117 + __name(decodeRaw, "decodeRaw"); 1118 + function decodeUnsafe(str) { 1119 + var buffer = esm_default2.decodeUnsafe(str); 1120 + if (buffer == null) 1121 + return; 1122 + return decodeRaw(buffer); 1123 + } 1124 + __name(decodeUnsafe, "decodeUnsafe"); 1125 + function decode(str) { 1126 + var buffer = esm_default2.decode(str); 1127 + var payload = decodeRaw(buffer); 1128 + if (payload == null) 1129 + throw new Error("Invalid checksum"); 1130 + return payload; 1131 + } 1132 + __name(decode, "decode"); 1133 + return { 1134 + encode, 1135 + decode, 1136 + decodeUnsafe 1137 + }; 1138 + } 1139 + __name(base_default, "default"); 1140 + 1141 + // ../node_modules/.deno/bs58check@4.0.0/node_modules/bs58check/src/esm/index.js 1142 + function sha256x2(buffer) { 1143 + return sha2562(sha2562(buffer)); 1144 + } 1145 + __name(sha256x2, "sha256x2"); 1146 + var esm_default3 = base_default(sha256x2); 1147 + 1148 + // components/output/bytes/automerge-repo-server/element.js 1149 + var DOC_IDS_STORAGE_KEY = "diffuse/output/automerge-repo-server/doc-ids"; 1150 + var PROTOCOL_VERSION = "1"; 1151 + var COLLECTIONS = ( 1152 + /** @type {const} */ 1153 + [ 1154 + "facets", 1155 + "playlists", 1156 + "themes", 1157 + "tracks" 1158 + ] 1159 + ); 1160 + var AutomergeRepoServerOutput = class extends DiffuseElement { 1161 + static { 1162 + __name(this, "AutomergeRepoServerOutput"); 1163 + } 1164 + static NAME = "diffuse/output/bytes/automerge-repo-server"; 1165 + /** @type {WebSocket | undefined} */ 1166 + #ws; 1167 + /** @type {PeerId} */ 1168 + #peerId = ( 1169 + /** @type {PeerId} */ 1170 + `diffuse-${crypto.randomUUID()}` 1171 + ); 1172 + /** @type {PeerId | undefined} */ 1173 + #serverPeerId; 1174 + /** @type {Record<string, Automerge.Doc<CollectionDocument>>} */ 1175 + #docs = {}; 1176 + /** @type {Record<string, Automerge.SyncState>} */ 1177 + #syncStates = {}; 1178 + /** @type {Record<string, DocumentId>} */ 1179 + #docIds = {}; 1180 + #manager; 1181 + constructor() { 1182 + super(); 1183 + this.#ensureDocs(); 1184 + const properties = { 1185 + facets: { 1186 + empty: /* @__PURE__ */ __name(() => this.#getBytes("facets"), "empty"), 1187 + get: /* @__PURE__ */ __name(async () => this.#getBytes("facets"), "get"), 1188 + put: /* @__PURE__ */ __name(async (data) => this.#putBytes("facets", data), "put") 1189 + }, 1190 + init: /* @__PURE__ */ __name(() => this.whenConnected(), "init"), 1191 + playlists: { 1192 + empty: /* @__PURE__ */ __name(() => this.#getBytes("playlists"), "empty"), 1193 + get: /* @__PURE__ */ __name(async () => this.#getBytes("playlists"), "get"), 1194 + put: /* @__PURE__ */ __name(async (data) => this.#putBytes("playlists", data), "put") 1195 + }, 1196 + themes: { 1197 + empty: /* @__PURE__ */ __name(() => this.#getBytes("themes"), "empty"), 1198 + get: /* @__PURE__ */ __name(async () => this.#getBytes("themes"), "get"), 1199 + put: /* @__PURE__ */ __name(async (data) => this.#putBytes("themes", data), "put") 1200 + }, 1201 + tracks: { 1202 + empty: /* @__PURE__ */ __name(() => this.#getBytes("tracks"), "empty"), 1203 + get: /* @__PURE__ */ __name(async () => this.#getBytes("tracks"), "get"), 1204 + put: /* @__PURE__ */ __name(async (data) => this.#putBytes("tracks", data), "put") 1205 + } 1206 + }; 1207 + this.#manager = outputManager(properties); 1208 + this.facets = this.#manager.facets; 1209 + this.playlists = this.#manager.playlists; 1210 + this.themes = this.#manager.themes; 1211 + this.tracks = this.#manager.tracks; 1212 + this.ready = () => true; 1213 + } 1214 + // LIFECYCLE 1215 + /** 1216 + * @override 1217 + */ 1218 + connectedCallback() { 1219 + super.connectedCallback(); 1220 + this.#loadDocIds(); 1221 + this.#connect(); 1222 + } 1223 + /** 1224 + * @override 1225 + */ 1226 + disconnectedCallback() { 1227 + super.disconnectedCallback(); 1228 + this.#ws?.close(); 1229 + this.#ws = void 0; 1230 + } 1231 + // DOCUMENT MANAGEMENT 1232 + #loadDocIds() { 1233 + const namespace = this.getAttribute("namespace") ?? "automerge-repo-server"; 1234 + const storageKey = `${DOC_IDS_STORAGE_KEY}/${namespace}`; 1235 + const stored = localStorage.getItem(storageKey); 1236 + if (stored) { 1237 + this.#docIds = JSON.parse(stored); 1238 + } 1239 + for (const name of COLLECTIONS) { 1240 + if (!this.#docIds[name]) { 1241 + const bytes = crypto.getRandomValues(new Uint8Array(16)); 1242 + bytes[6] = bytes[6] & 15 | 64; 1243 + bytes[8] = bytes[8] & 63 | 128; 1244 + const docId = ( 1245 + /** @type {DocumentId} */ 1246 + esm_default3.encode(bytes) 1247 + ); 1248 + const url = `automerge:${docId}`; 1249 + this.#docIds[name] = docId; 1250 + } 1251 + } 1252 + localStorage.setItem(storageKey, JSON.stringify(this.#docIds)); 1253 + } 1254 + #ensureDocs() { 1255 + for (const name of COLLECTIONS) { 1256 + if (!this.#docs[name]) { 1257 + this.#docs[name] = F(); 1258 + } 1259 + if (!this.#syncStates[name]) { 1260 + this.#syncStates[name] = Rt(); 1261 + } 1262 + } 1263 + } 1264 + /** 1265 + * @param {string} name 1266 + * @returns {Uint8Array} 1267 + */ 1268 + #getBytes(name) { 1269 + const doc = this.#docs[name]; 1270 + if (doc) return it(doc); 1271 + return new Uint8Array(); 1272 + } 1273 + /** 1274 + * @param {string} name 1275 + * @param {Uint8Array} data 1276 + */ 1277 + #putBytes(name, data) { 1278 + if (data.byteLength > 0) { 1279 + this.#docs[name] = st(data); 1280 + } else { 1281 + this.#docs[name] = F(); 1282 + } 1283 + this.#syncDoc(name); 1284 + } 1285 + // WEBSOCKET CONNECTION 1286 + #connect() { 1287 + const url = this.getAttribute("url"); 1288 + if (!url) return; 1289 + const ws = new WebSocket(url); 1290 + ws.binaryType = "arraybuffer"; 1291 + this.#ws = ws; 1292 + ws.addEventListener("open", () => { 1293 + this.#sendJoin(); 1294 + }); 1295 + ws.addEventListener("message", (event) => { 1296 + const msg = this.#cborDecode(new Uint8Array(event.data)); 1297 + this.#handleMessage(msg); 1298 + }); 1299 + ws.addEventListener("close", () => { 1300 + this.#serverPeerId = void 0; 1301 + this.#scheduleReconnect(); 1302 + }); 1303 + ws.addEventListener("error", () => { 1304 + ws.close(); 1305 + }); 1306 + } 1307 + #scheduleReconnect() { 1308 + if (!this.isConnected) return; 1309 + setTimeout(() => { 1310 + if (this.isConnected) this.#connect(); 1311 + }, 5e3); 1312 + } 1313 + // PROTOCOL 1314 + #sendJoin() { 1315 + this.#send({ 1316 + type: "join", 1317 + senderId: this.#peerId, 1318 + peerMetadata: { storageId: void 0, isEphemeral: true }, 1319 + supportedProtocolVersions: [PROTOCOL_VERSION] 1320 + }); 1321 + } 1322 + /** 1323 + * @param {any} msg 1324 + */ 1325 + #handleMessage(msg) { 1326 + switch (msg.type) { 1327 + case "peer": 1328 + this.#serverPeerId = msg.senderId; 1329 + this.#syncAllDocs(); 1330 + break; 1331 + case "sync": 1332 + case "request": 1333 + this.#handleSyncMessage(msg); 1334 + break; 1335 + case "doc-unavailable": 1336 + break; 1337 + case "error": 1338 + console.error("[automerge-repo-server]", msg.message); 1339 + break; 1340 + } 1341 + } 1342 + /** 1343 + * @param {{ documentId: DocumentId, data: Uint8Array }} msg 1344 + */ 1345 + #handleSyncMessage(msg) { 1346 + const name = this.#nameForDocId(msg.documentId); 1347 + if (!name) return; 1348 + const doc = this.#docs[name] ?? F(); 1349 + const syncState = this.#syncStates[name] ?? Rt(); 1350 + const [newDoc, newSyncState] = St( 1351 + doc, 1352 + syncState, 1353 + msg.data 1354 + ); 1355 + this.#docs[name] = newDoc; 1356 + this.#syncStates[name] = newSyncState; 1357 + this.#manager.signals[name].value = it(newDoc); 1358 + this.#syncDoc(name); 1359 + } 1360 + // SYNC 1361 + #syncAllDocs() { 1362 + for (const name of COLLECTIONS) { 1363 + this.#syncDoc(name); 1364 + } 1365 + } 1366 + /** 1367 + * @param {string} name 1368 + */ 1369 + #syncDoc(name) { 1370 + if (!this.#serverPeerId) return; 1371 + const doc = this.#docs[name]; 1372 + const syncState = this.#syncStates[name] ?? Rt(); 1373 + if (!doc) return; 1374 + const [newSyncState, syncMessage] = jt( 1375 + doc, 1376 + syncState 1377 + ); 1378 + this.#syncStates[name] = newSyncState; 1379 + if (syncMessage) { 1380 + this.#send({ 1381 + type: "sync", 1382 + senderId: this.#peerId, 1383 + targetId: this.#serverPeerId, 1384 + documentId: this.#docIds[name], 1385 + data: syncMessage 1386 + }); 1387 + } 1388 + } 1389 + // HELPERS 1390 + /** 1391 + * @template [T=unknown] 1392 + * @param {Uint8Array} data 1393 + * @returns {T} 1394 + */ 1395 + #cborDecode(data) { 1396 + return ( 1397 + /** @type {T} */ 1398 + decodeCBOR(data) 1399 + ); 1400 + } 1401 + /** 1402 + * @param {unknown} data 1403 + */ 1404 + #cborEncode(data) { 1405 + return encodeCBOR(data); 1406 + } 1407 + /** 1408 + * @param {object} msg 1409 + */ 1410 + #send(msg) { 1411 + if (this.#ws?.readyState === WebSocket.OPEN) { 1412 + this.#ws.send(this.#cborEncode(msg)); 1413 + } 1414 + } 1415 + /** 1416 + * @param {DocumentId} documentId 1417 + * @returns {string | undefined} 1418 + */ 1419 + #nameForDocId(documentId) { 1420 + for (const name of COLLECTIONS) { 1421 + if (this.#docIds[name] === documentId) return name; 1422 + } 1423 + return void 0; 1424 + } 1425 + }; 1426 + var element_default = AutomergeRepoServerOutput; 1427 + var CLASS = AutomergeRepoServerOutput; 1428 + var NAME = "dob-automerge-repo-server"; 1429 + customElements.define(NAME, AutomergeRepoServerOutput); 1430 + export { 1431 + CLASS, 1432 + NAME, 1433 + element_default as default 1434 + }; 1435 + /*! Bundled license information: 1436 + 1437 + @noble/hashes/esm/utils.js: 1438 + (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *) 1439 + */ 1440 + 1441 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/automerge-repo-server/element.js.map
··· 1 + ../../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/output/bytes/automerge-repo-server/element.js.map
+9
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/constants.js
··· 1 + import { 2 + OBJECT_PREFIX 3 + } from "../../../../chunk-FPIXTJ7E.js"; 4 + import "../../../../chunk-FZQXS3RE.js"; 5 + export { 6 + OBJECT_PREFIX 7 + }; 8 + 9 + //# sourceMappingURL=./constants.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/constants.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/bytes/s3/constants.js.map
+20
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-NMCS5TQK.js"; 6 + import "../../../../chunk-5UTOUDDD.js"; 7 + import "../../../../chunk-JBHW662S.js"; 8 + import "../../../../chunk-H46AZIKM.js"; 9 + import "../../../../chunk-G56PUJUJ.js"; 10 + import "../../../../chunk-IZOBPV2S.js"; 11 + import "../../../../chunk-EJ2QF5QE.js"; 12 + import "../../../../chunk-NCFHYTLD.js"; 13 + import "../../../../chunk-FZQXS3RE.js"; 14 + export { 15 + CLASS, 16 + NAME, 17 + element_default as default 18 + }; 19 + 20 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/element.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/output/bytes/s3/element.js.map"}
+55
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/worker.js
··· 1 + import { 2 + OBJECT_PREFIX 3 + } from "../../../../chunk-FPIXTJ7E.js"; 4 + import { 5 + createClient 6 + } from "../../../../chunk-AISBWLUT.js"; 7 + import "../../../../chunk-JBHW662S.js"; 8 + import "../../../../chunk-GX3WPNEX.js"; 9 + import "../../../../chunk-EEVL24MR.js"; 10 + import "../../../../chunk-G56PUJUJ.js"; 11 + import { 12 + ostiary, 13 + rpc 14 + } from "../../../../chunk-EJ2QF5QE.js"; 15 + import "../../../../chunk-NCFHYTLD.js"; 16 + import { 17 + __name, 18 + init_Buffer, 19 + init_process 20 + } from "../../../../chunk-FZQXS3RE.js"; 21 + 22 + // components/output/bytes/s3/worker.js 23 + init_Buffer(); 24 + init_process(); 25 + async function get({ bucket, name }) { 26 + const client = createClient(bucket); 27 + const path = bucket.path.replace(/(^\/+|\/+$)/g, ""); 28 + const key = `${path}/${OBJECT_PREFIX}${name}`; 29 + try { 30 + const response = await client.getObject(key); 31 + return await response.bytes(); 32 + } catch (err) { 33 + return void 0; 34 + } 35 + } 36 + __name(get, "get"); 37 + async function put({ bucket, data, name }) { 38 + const client = createClient(bucket); 39 + const path = bucket.path.replace(/(^\/+|\/+$)/g, ""); 40 + const key = `${path}/${OBJECT_PREFIX}${name}`; 41 + await client.putObject(key, data); 42 + } 43 + __name(put, "put"); 44 + ostiary((context) => { 45 + rpc(context, { 46 + get, 47 + put 48 + }); 49 + }); 50 + export { 51 + get, 52 + put 53 + }; 54 + 55 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/worker.js.map
··· 1 + {"version":3,"sources":["/worker.js"],"sourcesContent":["import { createClient } from \"@components/input/s3/common.js\";\nimport { ostiary, rpc } from \"@common/worker.js\";\n\nimport { OBJECT_PREFIX } from \"./constants.js\";\n\n/**\n * @import {S3OutputWorkerActions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ACTIONS\n////////////////////////////////////////////\n\n/**\n * @type {S3OutputWorkerActions[\"get\"]}\n */\nexport async function get({ bucket, name }) {\n const client = createClient(bucket);\n const path = bucket.path.replace(/(^\\/+|\\/+$)/g, \"\");\n const key = `${path}/${OBJECT_PREFIX}${name}`;\n\n try {\n const response = await client.getObject(key);\n return await response.bytes();\n } catch (err) {\n // Object doesn't exist yet, return undefined\n return undefined;\n }\n}\n\n/**\n * @type {S3OutputWorkerActions[\"put\"]}\n */\nexport async function put({ bucket, data, name }) {\n const client = createClient(bucket);\n const path = bucket.path.replace(/(^\\/+|\\/+$)/g, \"\");\n const key = `${path}/${OBJECT_PREFIX}${name}`;\n\n await client.putObject(key, data);\n}\n\n////////////////////////////////////////////\n// ⚡️\n////////////////////////////////////////////\n\nostiary((context) => {\n rpc(context, {\n get,\n put,\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAgBA,eAAsB,IAAI,EAAE,QAAQ,KAAK,GAAG;AAC1C,QAAM,SAAS,aAAa,MAAM;AAClC,QAAM,OAAO,OAAO,KAAK,QAAQ,gBAAgB,EAAE;AACnD,QAAM,MAAM,GAAG,IAAI,IAAI,aAAa,GAAG,IAAI;AAE3C,MAAI;AACF,UAAM,WAAW,MAAM,OAAO,UAAU,GAAG;AAC3C,WAAO,MAAM,SAAS,MAAM;AAAA,EAC9B,SAAS,KAAK;AAEZ,WAAO;AAAA,EACT;AACF;AAZsB;AAiBtB,eAAsB,IAAI,EAAE,QAAQ,MAAM,KAAK,GAAG;AAChD,QAAM,SAAS,aAAa,MAAM;AAClC,QAAM,OAAO,OAAO,KAAK,QAAQ,gBAAgB,EAAE;AACnD,QAAM,MAAM,GAAG,IAAI,IAAI,aAAa,GAAG,IAAI;AAE3C,QAAM,OAAO,UAAU,KAAK,IAAI;AAClC;AANsB;AAYtB,QAAQ,CAAC,YAAY;AACnB,MAAI,SAAS;AAAA,IACX;AAAA,IACA;AAAA,EACF,CAAC;AACH,CAAC;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/output/bytes/s3/worker.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/common.js
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/output/common.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/common.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/polymorphic/indexed-db/constants.js
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/polymorphic/indexed-db/constants.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/polymorphic/indexed-db/constants.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/constants.js.map
+19
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/polymorphic/indexed-db/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-WBRIGWBU.js"; 6 + import "../../../../chunk-5UTOUDDD.js"; 7 + import "../../../../chunk-H46AZIKM.js"; 8 + import "../../../../chunk-G56PUJUJ.js"; 9 + import "../../../../chunk-IZOBPV2S.js"; 10 + import "../../../../chunk-EJ2QF5QE.js"; 11 + import "../../../../chunk-NCFHYTLD.js"; 12 + import "../../../../chunk-FZQXS3RE.js"; 13 + export { 14 + CLASS, 15 + NAME, 16 + element_default as default 17 + }; 18 + 19 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/polymorphic/indexed-db/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/element.js.map
+41
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/polymorphic/indexed-db/worker.js
··· 1 + import { 2 + IDB_PREFIX 3 + } from "../../../../chunk-FAW4EB7G.js"; 4 + import { 5 + get, 6 + set 7 + } from "../../../../chunk-JBHW662S.js"; 8 + import { 9 + ostiary, 10 + rpc 11 + } from "../../../../chunk-EJ2QF5QE.js"; 12 + import "../../../../chunk-NCFHYTLD.js"; 13 + import { 14 + __name, 15 + init_Buffer, 16 + init_process 17 + } from "../../../../chunk-FZQXS3RE.js"; 18 + 19 + // components/output/polymorphic/indexed-db/worker.js 20 + init_Buffer(); 21 + init_process(); 22 + async function get2({ name }) { 23 + return await get(`${IDB_PREFIX}/${name}`); 24 + } 25 + __name(get2, "get"); 26 + async function put({ data, name }) { 27 + return await set(`${IDB_PREFIX}/${name}`, data); 28 + } 29 + __name(put, "put"); 30 + ostiary((context) => { 31 + rpc(context, { 32 + get: get2, 33 + put 34 + }); 35 + }); 36 + export { 37 + get2 as get, 38 + put 39 + }; 40 + 41 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/polymorphic/indexed-db/worker.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/polymorphic/indexed-db/worker.js.map
+21
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/raw/atproto/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-OIQMICML.js"; 6 + import "../../../../chunk-UACRVUBF.js"; 7 + import "../../../../chunk-77ZY4GQV.js"; 8 + import "../../../../chunk-5UTOUDDD.js"; 9 + import "../../../../chunk-H46AZIKM.js"; 10 + import "../../../../chunk-G56PUJUJ.js"; 11 + import "../../../../chunk-IZOBPV2S.js"; 12 + import "../../../../chunk-EJ2QF5QE.js"; 13 + import "../../../../chunk-NCFHYTLD.js"; 14 + import "../../../../chunk-FZQXS3RE.js"; 15 + export { 16 + CLASS, 17 + NAME, 18 + element_default as default 19 + }; 20 + 21 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/raw/atproto/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/raw/atproto/oauth.js
··· 1 + ../../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/output/raw/atproto/oauth.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/raw/atproto/oauth.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/oauth.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/artwork/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/processor/artwork/constants.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/artwork/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/constants.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/artwork/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-M4NQYVPY.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/artwork/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/element.js.map
+177
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/artwork/worker.js
··· 1 + import { 2 + musicMetadataTags 3 + } from "../../../chunk-H6TRVIGW.js"; 4 + import "../../../chunk-J34EA5F4.js"; 5 + import "../../../chunk-CPN2PPDQ.js"; 6 + import "../../../chunk-OFPH7GQJ.js"; 7 + import "../../../chunk-RSBJ77HU.js"; 8 + import "../../../chunk-CMU4QLMC.js"; 9 + import "../../../chunk-JSOX7OQB.js"; 10 + import "../../../chunk-XXGFKU7I.js"; 11 + import "../../../chunk-ERP4MUHU.js"; 12 + import { 13 + IDB_ARTWORK_PREFIX 14 + } from "../../../chunk-PJWFBDSG.js"; 15 + import { 16 + get, 17 + set 18 + } from "../../../chunk-JBHW662S.js"; 19 + import "../../../chunk-EEVL24MR.js"; 20 + import { 21 + ostiary, 22 + rpc 23 + } from "../../../chunk-EJ2QF5QE.js"; 24 + import "../../../chunk-NCFHYTLD.js"; 25 + import "../../../chunk-DUCTMCPX.js"; 26 + import "../../../chunk-UGE3FKYA.js"; 27 + import { 28 + __name, 29 + init_Buffer, 30 + init_process 31 + } from "../../../chunk-FZQXS3RE.js"; 32 + 33 + // components/processor/artwork/worker.js 34 + init_Buffer(); 35 + init_process(); 36 + var queue = []; 37 + async function artwork(request) { 38 + const art = await processRequest(request); 39 + return art; 40 + } 41 + __name(artwork, "artwork"); 42 + function supply(items) { 43 + const exe = !queue[0]; 44 + queue = [...queue, ...items]; 45 + if (exe) shiftQueue(); 46 + } 47 + __name(supply, "supply"); 48 + ostiary((context) => { 49 + rpc(context, { 50 + artwork, 51 + supply 52 + }); 53 + }); 54 + function escapeLucene(str) { 55 + return [].map.call(str, (char) => { 56 + if (char === "+" || char === "-" || char === "&" || char === "|" || char === "!" || char === "(" || char === ")" || char === "{" || char === "}" || char === "[" || char === "]" || char === "^" || char === '"' || char === "~" || char === "*" || char === "?" || char === ":" || char === "\\" || char === "/") { 57 + return "\\" + char; 58 + } else return char; 59 + }).join(""); 60 + } 61 + __name(escapeLucene, "escapeLucene"); 62 + async function lastFm(req) { 63 + if (!navigator.onLine) return []; 64 + const query = req.tags?.artist; 65 + return await fetch( 66 + `https://ws.audioscrobbler.com/2.0/?method=album.search&album=${query}&api_key=4f0fe85b67baef8bb7d008a8754a95e5&format=json` 67 + ).then((r) => r.json()).then((r) => lastFmCover(r.results.albummatches.album)).catch((err) => { 68 + console.error(err); 69 + return []; 70 + }); 71 + } 72 + __name(lastFm, "lastFm"); 73 + async function lastFmCover(remainingMatches) { 74 + const album = remainingMatches[0]; 75 + const url = album ? album.image[album.image.length - 1]["#text"] : null; 76 + return url && url !== "" ? await fetch(url).then((r) => r.blob()).then(async (b) => [ 77 + { 78 + bytes: await b.arrayBuffer().then((buf) => new Uint8Array(buf)), 79 + mime: b.type 80 + } 81 + ]).catch((err) => { 82 + return lastFmCover(remainingMatches.slice(1)); 83 + }) : album ? lastFmCover(remainingMatches.slice(1)) : []; 84 + } 85 + __name(lastFmCover, "lastFmCover"); 86 + async function musicBrainz(req) { 87 + const artist = req.tags?.artist; 88 + const album = req.tags?.album; 89 + if (!navigator.onLine) return []; 90 + if (!album && !artist) return []; 91 + const query = `release:"${escapeLucene(album || "")}"` + (req.variousArtists ? `` : ` AND artistname:"${escapeLucene(artist || "")}"`); 92 + const encodedQuery = encodeURIComponent(query); 93 + return await fetch( 94 + `https://musicbrainz.org/ws/2/release/?query=${encodedQuery}&fmt=json` 95 + ).then((r) => r.json()).then((r) => { 96 + if (r.releases.length === 0 && !req.variousArtists) { 97 + return musicBrainz({ ...req, variousArtists: true }); 98 + } else { 99 + return musicBrainzCover(r.releases, req); 100 + } 101 + }).catch((err) => { 102 + return []; 103 + }); 104 + } 105 + __name(musicBrainz, "musicBrainz"); 106 + async function musicBrainzCover(remainingReleases, req) { 107 + const release = remainingReleases[0]; 108 + if (!release) return []; 109 + const credit = release?.["artist-credit"]?.[0]?.name; 110 + if (req.variousArtists && credit !== "Various Artists" && credit !== req.tags?.artist) return []; 111 + return await fetch( 112 + `https://coverartarchive.org/release/${release.id}/front-1200` 113 + ).then((r) => r.blob()).then(async (b) => { 114 + if (b.type.startsWith("image/")) { 115 + return [{ 116 + bytes: await b.arrayBuffer().then((buf) => new Uint8Array(buf)), 117 + mime: b.type 118 + }]; 119 + } else { 120 + return musicBrainzCover(remainingReleases.slice(1), req); 121 + } 122 + }).catch((err) => { 123 + console.error(err); 124 + return musicBrainzCover(remainingReleases.slice(1), req); 125 + }); 126 + } 127 + __name(musicBrainzCover, "musicBrainzCover"); 128 + async function processRequest(req) { 129 + const cache = await get(`${IDB_ARTWORK_PREFIX}/${req.cacheId}`); 130 + if (cache && Array.isArray(cache) && cache.length) return cache; 131 + if (req.tags?.artist?.toUpperCase() === "VA") { 132 + req.variousArtists = true; 133 + } 134 + let art = []; 135 + const meta = await musicMetadataTags({ ...req, includeArtwork: true }).catch( 136 + /** @param {Error} err */ 137 + (err) => { 138 + console.error("music-metadata error", err); 139 + const extraction = {}; 140 + return extraction; 141 + } 142 + ); 143 + if (!req.tags && meta.tags) req.tags = meta.tags; 144 + const fromMeta = meta.artwork?.map( 145 + /** 146 + * @param {IPicture} a 147 + */ 148 + (a) => { 149 + return { bytes: a.data, mime: a.format }; 150 + } 151 + ) || []; 152 + art.push(...fromMeta); 153 + if (art.length === 0) { 154 + const fromMusicBrainz = await musicBrainz(req); 155 + art.push(...fromMusicBrainz); 156 + } 157 + if (art.length === 0) { 158 + const fromLastFm = await lastFm(req); 159 + art.push(...fromLastFm); 160 + } 161 + await set(`${IDB_ARTWORK_PREFIX}/${req.cacheId}`, art); 162 + return art; 163 + } 164 + __name(processRequest, "processRequest"); 165 + async function shiftQueue() { 166 + const next = queue.shift(); 167 + if (!next) return; 168 + await processRequest(next); 169 + await shiftQueue(); 170 + } 171 + __name(shiftQueue, "shiftQueue"); 172 + export { 173 + artwork, 174 + supply 175 + }; 176 + 177 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/artwork/worker.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/processor/artwork/worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/metadata/common.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/processor/metadata/common.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/metadata/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/common.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/metadata/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-4XYXC3TC.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/metadata/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/metadata/worker.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/processor/metadata/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/metadata/worker.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/processor/metadata/worker.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/search/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/processor/search/constants.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/search/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/constants.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/search/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-CTVRRF4G.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/search/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/search/worker.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/processor/search/worker.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/processor/search/worker.js.map
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/processor/search/worker.js.map
+14
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/base.js
··· 1 + import { 2 + OutputTransformer 3 + } from "../../../chunk-3G4WUGDN.js"; 4 + import "../../../chunk-H46AZIKM.js"; 5 + import "../../../chunk-G56PUJUJ.js"; 6 + import "../../../chunk-IZOBPV2S.js"; 7 + import "../../../chunk-EJ2QF5QE.js"; 8 + import "../../../chunk-NCFHYTLD.js"; 9 + import "../../../chunk-FZQXS3RE.js"; 10 + export { 11 + OutputTransformer 12 + }; 13 + 14 + //# sourceMappingURL=./base.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/base.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/base.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/automerge/constants.js
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/constants.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/automerge/constants.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/constants.js.map
+23
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/automerge/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../../chunk-DG4EBNDV.js"; 6 + import "../../../../../chunk-R65OZ4FV.js"; 7 + import "../../../../../chunk-3G4WUGDN.js"; 8 + import "../../../../../chunk-P3M4HQTD.js"; 9 + import "../../../../../chunk-H46AZIKM.js"; 10 + import "../../../../../chunk-G56PUJUJ.js"; 11 + import "../../../../../chunk-IZOBPV2S.js"; 12 + import "../../../../../chunk-EJ2QF5QE.js"; 13 + import "../../../../../chunk-NCFHYTLD.js"; 14 + import "../../../../../chunk-DUCTMCPX.js"; 15 + import "../../../../../chunk-UGE3FKYA.js"; 16 + import "../../../../../chunk-FZQXS3RE.js"; 17 + export { 18 + CLASS, 19 + NAME, 20 + element_default as default 21 + }; 22 + 23 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/automerge/element.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/transformer/output/bytes/automerge/element.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/automerge/utils.js
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/utils.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/automerge/utils.js.map
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/utils.js.map
+122
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/json/element.js
··· 1 + import { 2 + OutputTransformer 3 + } from "../../../../../chunk-3G4WUGDN.js"; 4 + import "../../../../../chunk-H46AZIKM.js"; 5 + import "../../../../../chunk-G56PUJUJ.js"; 6 + import { 7 + computed 8 + } from "../../../../../chunk-IZOBPV2S.js"; 9 + import "../../../../../chunk-EJ2QF5QE.js"; 10 + import "../../../../../chunk-NCFHYTLD.js"; 11 + import { 12 + __name, 13 + init_Buffer, 14 + init_process 15 + } from "../../../../../chunk-FZQXS3RE.js"; 16 + 17 + // components/transformer/output/bytes/json/element.js 18 + init_Buffer(); 19 + init_process(); 20 + var JsonStringOutputTransformer = class extends OutputTransformer { 21 + static { 22 + __name(this, "JsonStringOutputTransformer"); 23 + } 24 + constructor() { 25 + super(); 26 + const base = this.base(); 27 + const manager = { 28 + facets: { 29 + ...base.facets, 30 + collection: computed(() => { 31 + const data = base.facets.collection(); 32 + const c = parseArray(data); 33 + return c; 34 + }), 35 + save: /* @__PURE__ */ __name(async (newFacets) => { 36 + const json = JSON.stringify(newFacets); 37 + const encoder = new TextEncoder(); 38 + const bytes = encoder.encode(json); 39 + await base.facets.save(bytes); 40 + }, "save") 41 + }, 42 + playlists: { 43 + ...base.playlists, 44 + collection: computed(() => { 45 + const data = base.playlists.collection(); 46 + const c = parseArray(data); 47 + return c; 48 + }), 49 + save: /* @__PURE__ */ __name(async (newPlaylists) => { 50 + const json = JSON.stringify(newPlaylists); 51 + const encoder = new TextEncoder(); 52 + const bytes = encoder.encode(json); 53 + await base.playlists.save(bytes); 54 + }, "save") 55 + }, 56 + themes: { 57 + ...base.themes, 58 + collection: computed(() => { 59 + const data = base.themes.collection(); 60 + const c = parseArray(data); 61 + return c; 62 + }), 63 + save: /* @__PURE__ */ __name(async (newThemes) => { 64 + const json = JSON.stringify(newThemes); 65 + const encoder = new TextEncoder(); 66 + const bytes = encoder.encode(json); 67 + await base.themes.save(bytes); 68 + }, "save") 69 + }, 70 + tracks: { 71 + ...base.tracks, 72 + collection: computed(() => { 73 + const data = base.tracks.collection(); 74 + const c = parseArray(data); 75 + return c; 76 + }), 77 + save: /* @__PURE__ */ __name(async (newTracks) => { 78 + const json = JSON.stringify(newTracks); 79 + const encoder = new TextEncoder(); 80 + const bytes = encoder.encode(json); 81 + await base.tracks.save(bytes); 82 + }, "save") 83 + }, 84 + // Other 85 + ready: base.ready 86 + }; 87 + this.facets = manager.facets; 88 + this.playlists = manager.playlists; 89 + this.themes = manager.themes; 90 + this.tracks = manager.tracks; 91 + this.ready = manager.ready; 92 + } 93 + }; 94 + function parseArray(data) { 95 + let json; 96 + if (data instanceof Uint8Array) { 97 + const decoder = new TextDecoder(); 98 + json = decoder.decode(data); 99 + } else if (data === void 0) { 100 + return []; 101 + } else { 102 + json = data; 103 + } 104 + try { 105 + return JSON.parse(json); 106 + } catch (err) { 107 + console.error(err); 108 + return []; 109 + } 110 + } 111 + __name(parseArray, "parseArray"); 112 + var element_default = JsonStringOutputTransformer; 113 + var CLASS = JsonStringOutputTransformer; 114 + var NAME = "dtos-json"; 115 + customElements.define(NAME, CLASS); 116 + export { 117 + CLASS, 118 + NAME, 119 + element_default as default 120 + }; 121 + 122 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/json/element.js.map
··· 1 + ../../../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/transformer/output/bytes/json/element.js.map
+19
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/refiner/default/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../../chunk-6YF7B6KW.js"; 6 + import "../../../../../chunk-3G4WUGDN.js"; 7 + import "../../../../../chunk-H46AZIKM.js"; 8 + import "../../../../../chunk-G56PUJUJ.js"; 9 + import "../../../../../chunk-IZOBPV2S.js"; 10 + import "../../../../../chunk-EJ2QF5QE.js"; 11 + import "../../../../../chunk-NCFHYTLD.js"; 12 + import "../../../../../chunk-FZQXS3RE.js"; 13 + export { 14 + CLASS, 15 + NAME, 16 + element_default as default 17 + }; 18 + 19 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/refiner/default/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/refiner/default/element.js.map
+19
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/string/json/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../../chunk-OIUQ2WMN.js"; 6 + import "../../../../../chunk-3G4WUGDN.js"; 7 + import "../../../../../chunk-H46AZIKM.js"; 8 + import "../../../../../chunk-G56PUJUJ.js"; 9 + import "../../../../../chunk-IZOBPV2S.js"; 10 + import "../../../../../chunk-EJ2QF5QE.js"; 11 + import "../../../../../chunk-NCFHYTLD.js"; 12 + import "../../../../../chunk-FZQXS3RE.js"; 13 + export { 14 + CLASS, 15 + NAME, 16 + element_default as default 17 + }; 18 + 19 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/string/json/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/string/json/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/definitions/index.ts
··· 1 + ../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/definitions/index.ts
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/definitions/output/facet.json
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/definitions/output/facet.json
+67
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/definitions/output/playlist.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.diffuse.output.playlist", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": ["id", "items", "name", "unordered"], 10 + "properties": { 11 + "id": { "type": "string" }, 12 + "smart": { 13 + "type": "ref", 14 + "ref": "#smart" 15 + }, 16 + "createdAt": { "type": "string", "format": "datetime" }, 17 + "items": { 18 + "type": "array", 19 + "items": { 20 + "type": "ref", 21 + "ref": "#item" 22 + } 23 + }, 24 + "name": { 25 + "type": "string" 26 + }, 27 + "unordered": { 28 + "type": "boolean", 29 + "default": false, 30 + "description": "If this property is set to true, the playlist items should not be presented in order. It's considered an unordered collection of tracks." 31 + }, 32 + "updatedAt": { "type": "string", "format": "datetime" } 33 + } 34 + } 35 + }, 36 + "criterion": { 37 + "type": "object", 38 + "required": ["field", "value"], 39 + "properties": { 40 + "field": { "type": "string" }, 41 + "transformations": { 42 + "type": "array", 43 + "items": { "type": "ref", "ref": "#transformation" } 44 + }, 45 + "value": { 46 + "type": "unknown", 47 + "description": "Value that should be matched belonging to the given field" 48 + } 49 + } 50 + }, 51 + "item": { 52 + "type": "object", 53 + "description": "Does not necessarily match one track. You can make it a smart playlist by having the criteria match multiple tracks.", 54 + "required": ["criteria"], 55 + "properties": { 56 + "criteria": { 57 + "type": "array", 58 + "items": { "type": "ref", "ref": "#criterion" } 59 + } 60 + } 61 + }, 62 + "transformation": { 63 + "type": "string", 64 + "description": "Transformation to apply to the field value before comparison. This transformation is method to call on the value. For example, `toString`" 65 + } 66 + } 67 + }
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/definitions/output/theme.json
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/definitions/output/theme.json
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/definitions/output/track.json
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/definitions/output/track.json
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/examples/generate-playlist.html.txt
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/facets/examples/generate-playlist.html.txt
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/examples/now-playing.html.txt
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/facets/examples/now-playing.html.txt
+411
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <title>Diffuse</title> 7 + 8 + <!-- Base --> 9 + <base href="../" /> 10 + 11 + <!-- Favicons & Mobile --> 12 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 13 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 14 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 15 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 16 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 17 + <meta name="msapplication-TileColor" content="#8a90a9" /> 18 + <meta name="theme-color" content="#8a90a9" /> 19 + 20 + <!-- Styles --> 21 + <link rel="stylesheet" href="styles/base.css" /> 22 + <link rel="stylesheet" href="styles/diffuse/page.css" /> 23 + <link rel="stylesheet" href="styles/vendor/phosphor/fill/style.css" /> 24 + 25 + <!-- Scripts --> 26 + <script src="facets/index.js" type="module"></script> 27 + </head> 28 + <body> 29 + <header> 30 + <div> 31 + <div> 32 + <a class="diffuse-logo" href="./" style="display: inline-block;"> 33 + <svg viewBox="0 0 902 134" width="160"> 34 + <title>Diffuse</title> 35 + <use 36 + xlink:href="images/diffuse-current.svg#diffuse" 37 + href="images/diffuse-current.svg#diffuse"></use> 38 + </svg> 39 + 40 + </a> 41 + </div> 42 + <p class="construct dither-mask" style="margin-top: 0; max-width: none;"> 43 + Facets 44 + </p> 45 + <p> 46 + Facets are various interface components each loaded in their own web page. Every used component is configured so that it operates in broadcast mode, making all the pages communicate with each other. 47 + </p> 48 + 49 + <ul class="table-of-contents"> 50 + <li><a href="facets/#built-in">Built-in</a></li> 51 + <li><a href="facets/#community">Community</a></li> 52 + <li><a href="facets/#collection">Your collection</a></li> 53 + <li><a href="facets/#examples">Examples</a></li> 54 + <li><a href="facets/#build">Build</a></li> 55 + <li><a href="facets/#foundation">Foundation</a></li> 56 + </ul> 57 + </div> 58 + <div class="dither-mask filler"></div> 59 + </header> 60 + <main> 61 + <!-- BUILT-IN --> 62 + <div class="columns"> 63 + <section class="flex"> 64 + <h2 id="built-in">Built-in</h2> 65 + 66 + <ul> 67 + <li data-url="themes/blur/artwork-controller/facet.html.txt" data-name="Blur / Artwork controller"> 68 + <span>Blur / Artwork controller</span> 69 + <div class="list-description"> 70 + <div class="button-row"> 71 + <a href="facets/l/?url=themes%2Fblur%2Fartwork-controller%2Ffacet.html.txt" class="button button--bg-twist-1"> 72 + <span class="with-icon"> 73 + <i class="ph-fill ph-globe"></i> Open 74 + </span> 75 + </a> 76 + <button rel="save" class="button--bg-twist-1 button--subtle"> 77 + <span class="with-icon"> 78 + <i class="ph-fill ph-download"></i> Save 79 + </span> 80 + </button> 81 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 82 + <span class="with-icon"> 83 + <i class="ph-fill ph-cursor-text"></i> Edit 84 + </span> 85 + </button> 86 + </div> 87 + <div> 88 + Audio playback controller with an artwork display. 89 + </div> 90 + </div> 91 + </li> 92 + <li data-url="facets/tools/auto-queue.html.txt" data-name="Tools / Automatic Queue"> 93 + <span>Tools / Automatic Queue</span> 94 + <div class="list-description"> 95 + <div class="button-row"> 96 + <a href="facets/l/?url=facets%2Ftools%2Fauto-queue.html.txt" class="button button--bg-twist-1"> 97 + <span class="with-icon"> 98 + <i class="ph-fill ph-globe"></i> Open 99 + </span> 100 + </a> 101 + <button rel="save" class="button--bg-twist-1 button--subtle"> 102 + <span class="with-icon"> 103 + <i class="ph-fill ph-download"></i> Save 104 + </span> 105 + </button> 106 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 107 + <span class="with-icon"> 108 + <i class="ph-fill ph-cursor-text"></i> Edit 109 + </span> 110 + </button> 111 + </div> 112 + <div> 113 + Everything you need to automatically put tracks into the queue. 114 + </div> 115 + </div> 116 + </li> 117 + <li data-url="facets/tools/v3-import.html.txt" data-name="Tools / V3.x Import"> 118 + <span>Tools / V3.x Import</span> 119 + <div class="list-description"> 120 + <div class="button-row"> 121 + <a href="facets/l/?url=facets%2Ftools%2Fv3-import.html.txt" class="button button--bg-twist-1"> 122 + <span class="with-icon"> 123 + <i class="ph-fill ph-globe"></i> Open 124 + </span> 125 + </a> 126 + <button rel="save" class="button--bg-twist-1 button--subtle"> 127 + <span class="with-icon"> 128 + <i class="ph-fill ph-download"></i> Save 129 + </span> 130 + </button> 131 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 132 + <span class="with-icon"> 133 + <i class="ph-fill ph-cursor-text"></i> Edit 134 + </span> 135 + </button> 136 + </div> 137 + <div> 138 + Import data from Diffuse v3. 139 + </div> 140 + </div> 141 + </li> 142 + <li data-url="themes/webamp/browser/facet.html.txt" data-name="Webamp / Browser"> 143 + <span>Webamp / Browser</span> 144 + <div class="list-description"> 145 + <div class="button-row"> 146 + <a href="facets/l/?url=themes%2Fwebamp%2Fbrowser%2Ffacet.html.txt" class="button button--bg-twist-1"> 147 + <span class="with-icon"> 148 + <i class="ph-fill ph-globe"></i> Open 149 + </span> 150 + </a> 151 + <button rel="save" class="button--bg-twist-1 button--subtle"> 152 + <span class="with-icon"> 153 + <i class="ph-fill ph-download"></i> Save 154 + </span> 155 + </button> 156 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 157 + <span class="with-icon"> 158 + <i class="ph-fill ph-cursor-text"></i> Edit 159 + </span> 160 + </button> 161 + </div> 162 + <div> 163 + Collection browser + search in a retro, win98, look. 164 + </div> 165 + </div> 166 + </li> 167 + <li data-url="themes/webamp/configurators/input/facet.html.txt" data-name="Webamp / Input Configurator"> 168 + <span>Webamp / Input Configurator</span> 169 + <div class="list-description"> 170 + <div class="button-row"> 171 + <a href="facets/l/?url=themes%2Fwebamp%2Fconfigurators%2Finput%2Ffacet.html.txt" class="button button--bg-twist-1"> 172 + <span class="with-icon"> 173 + <i class="ph-fill ph-globe"></i> Open 174 + </span> 175 + </a> 176 + <button rel="save" class="button--bg-twist-1 button--subtle"> 177 + <span class="with-icon"> 178 + <i class="ph-fill ph-download"></i> Save 179 + </span> 180 + </button> 181 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 182 + <span class="with-icon"> 183 + <i class="ph-fill ph-cursor-text"></i> Edit 184 + </span> 185 + </button> 186 + </div> 187 + <div> 188 + Windows 98 styled input configurator where you can add music sources. 189 + </div> 190 + </div> 191 + </li> 192 + <li data-url="themes/webamp/configurators/output/facet.html.txt" data-name="Webamp / Output Configurator"> 193 + <span>Webamp / Output Configurator</span> 194 + <div class="list-description"> 195 + <div class="button-row"> 196 + <a href="facets/l/?url=themes%2Fwebamp%2Fconfigurators%2Foutput%2Ffacet.html.txt" class="button button--bg-twist-1"> 197 + <span class="with-icon"> 198 + <i class="ph-fill ph-globe"></i> Open 199 + </span> 200 + </a> 201 + <button rel="save" class="button--bg-twist-1 button--subtle"> 202 + <span class="with-icon"> 203 + <i class="ph-fill ph-download"></i> Save 204 + </span> 205 + </button> 206 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 207 + <span class="with-icon"> 208 + <i class="ph-fill ph-cursor-text"></i> Edit 209 + </span> 210 + </button> 211 + </div> 212 + <div> 213 + Windows 98 styled output configurator where you can manage your data storage. 214 + </div> 215 + </div> 216 + </li> 217 + </ul> 218 + 219 + </section> 220 + 221 + <section class="flex"> 222 + <h2 id="community">Community</h2> 223 + <p> 224 + Check out some facets from the community and load them here. 225 + </p> 226 + <p> 227 + <small><i class="ph-fill ph-info"></i> Nothing here yet, too early.</small> 228 + </p> 229 + </section> 230 + </div> 231 + 232 + <!-- LIST + EXAMPLES --> 233 + <div class="columns"> 234 + <section class="flex"> 235 + <h2 id="collection">Your collection</h2> 236 + <div id="list"></div> 237 + </section> 238 + 239 + <section class="flex"> 240 + <h2 id="examples">Examples</h2> 241 + 242 + <p> 243 + Some simple examples to help you understand how to build your own facet. Fork them to load them into the code editor below (or save → edit). 244 + </p> 245 + 246 + <ul> 247 + <li data-url="facets/examples/now-playing.html.txt" data-name="Now playing"> 248 + <span>Now playing</span> 249 + <div class="list-description"> 250 + <div class="button-row"> 251 + <a href="facets/l/?url=facets%2Fexamples%2Fnow-playing.html.txt" class="button button--bg-twist-1"> 252 + <span class="with-icon"> 253 + <i class="ph-fill ph-globe"></i> Open 254 + </span> 255 + </a> 256 + <button rel="save" class="button--bg-twist-1 button--subtle"> 257 + <span class="with-icon"> 258 + <i class="ph-fill ph-download"></i> Save 259 + </span> 260 + </button> 261 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 262 + <span class="with-icon"> 263 + <i class="ph-fill ph-cursor-text"></i> Edit 264 + </span> 265 + </button> 266 + </div> 267 + <div> 268 + Shows what's currently set to &quot;now playing&quot; in the queue, along with a button to shift the queue to the next track. 269 + </div> 270 + </div> 271 + </li> 272 + <li data-url="facets/examples/generate-playlist.html.txt" data-name="Generate playlist"> 273 + <span>Generate playlist</span> 274 + <div class="list-description"> 275 + <div class="button-row"> 276 + <a href="facets/l/?url=facets%2Fexamples%2Fgenerate-playlist.html.txt" class="button button--bg-twist-1"> 277 + <span class="with-icon"> 278 + <i class="ph-fill ph-globe"></i> Open 279 + </span> 280 + </a> 281 + <button rel="save" class="button--bg-twist-1 button--subtle"> 282 + <span class="with-icon"> 283 + <i class="ph-fill ph-download"></i> Save 284 + </span> 285 + </button> 286 + <button rel="fork" class="button--bg-twist-1 button--subtle"> 287 + <span class="with-icon"> 288 + <i class="ph-fill ph-cursor-text"></i> Edit 289 + </span> 290 + </button> 291 + </div> 292 + <div> 293 + Make a list of what previously played in the queue. 294 + </div> 295 + </div> 296 + </li> 297 + </ul> 298 + 299 + </section> 300 + </div> 301 + 302 + <!-- / --> 303 + <div class="dither-mask filler" style="height: var(--space-2xl); margin-top: var(--space-2xl);"></div> 304 + 305 + <!-- BUILD --> 306 + <section> 307 + <h2 id="build">Build</h2> 308 + 309 + <form id="build-form" class="columns"> 310 + <div class="flex"> 311 + <p style="margin-top: 0"> 312 + If you know a bit of HTML & Javascript, you can write your own or plug in some code you found elsewhere: 313 + </p> 314 + 315 + <div id="html-input-container" class="code-editor monospace-font"> 316 + </div> 317 + </div> 318 + 319 + <div class="flex"> 320 + <p style="margin-top: 0"> 321 + Your code here builds on the <a href="facets/#foundation">foundation</a> listed below, it'll be injected into a <code>&lt;div id="container"&gt;</code> element in the body. 322 + </p> 323 + <input id="name-input" type="text" placeholder="Name" name="name" required /> 324 + <p> 325 + <span class="button-row"> 326 + <button name="save">Save</button> 327 + <button name="save+open">Save &amp; Open</button> 328 + </span> 329 + </p> 330 + </div> 331 + </form> 332 + </section> 333 + 334 + <!-- FOUNDATION --> 335 + <div class="columns" style="margin-top: var(--space-2xl);"> 336 + <section style="flex-grow: 10; max-width: var(--container-xl);"> 337 + <h2 id="foundation" style="margin-top: 0;">Foundation</h2> 338 + 339 + <p> 340 + Diffuse comes with a foundation that preconfigures all elements so you don't have to set them up yourself, along with a combination of elements for certain features. It internally tracks the DOM addition of the custom elements, so no need to worry about setting up an element multiple times. 341 + </p> 342 + <p> 343 + <small><i class="ph-fill ph-info"></i> Refer to the <a href="#elements">elements index</a> to find out what each element does.</small> 344 + </p> 345 + <div class="code-block"> 346 + <code>import foundation from "common/facets/foundation.js" 347 + 348 + foundation.engine.audio() 349 + foundation.engine.queue() 350 + foundation.engine.repeatShuffle() 351 + foundation.engine.scope() 352 + 353 + foundation.orchestrator.autoQueue() 354 + foundation.orchestrator.favourites() 355 + foundation.orchestrator.input() 356 + foundation.orchestrator.output() 357 + foundation.orchestrator.queueAudio() 358 + foundation.orchestrator.processTracks() 359 + foundation.orchestrator.scopedTracks() 360 + foundation.orchestrator.sources() 361 + 362 + foundation.processor.artwork() 363 + foundation.processor.metadata() 364 + foundation.processor.search()</code> 365 + </div> 366 + 367 + <p> 368 + <small>Features:</small> 369 + </p> 370 + <ul style="margin-bottom: 0;"> 371 + <li> 372 + <span>Fill the queue automatically <small>(infinite play)</small></span> 373 + <div class="list-description"> 374 + <code>foundation.features.fillQueueAutomatically()</code> 375 + </div> 376 + </li> 377 + <li> 378 + <span>Play audio from the queue</span> 379 + <div class="list-description"> 380 + <code>foundation.features.playAudioFromQueue()</code> 381 + </div> 382 + </li> 383 + <li> 384 + <span>Process inputs <small>(into tracks, etc)</small></span> 385 + <div class="list-description"> 386 + <code>foundation.features.processInputs()</code> 387 + </div> 388 + </li> 389 + <li> 390 + <span>Search through your collection</span> 391 + <div class="list-description" style="margin-bottom: 0;"> 392 + <code>foundation.features.searchThroughCollection()</code> 393 + </div> 394 + </li> 395 + </ul> 396 + <h3>Notes</h3> 397 + <p> 398 + While you have the ability to do whatever you want in a custom facet, the existing facets are designed to work a certain way; so here's some things to keep in mind: 399 + </p> 400 + <ul> 401 + <li><span>In most cases you'll want to call <code>foundation.features.processInputs()</code> so that your audio files and streams actually show up.</span></li> 402 + <li><span>Most elements are configured in broadcast mode so they communicate across tabs. There are a few exceptions such as inputs, where we prefer parallelisation.</span></li> 403 + </ul> 404 + </section> 405 + 406 + <div class="dither-mask filler"></div> 407 + </div> 408 + </main> 409 + 410 + </body> 411 + </html>
+318
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-WM2QH5TD.js"; 9 + import { 10 + foundation_default 11 + } from "../chunk-T6K5PZ3T.js"; 12 + import "../chunk-M4NQYVPY.js"; 13 + import "../chunk-4XYXC3TC.js"; 14 + import "../chunk-CTVRRF4G.js"; 15 + import "../chunk-IR27WFXT.js"; 16 + import "../chunk-C7BSJ3AC.js"; 17 + import "../chunk-CPS76EE2.js"; 18 + import "../chunk-MA2JKS5M.js"; 19 + import "../chunk-3SF5BNF4.js"; 20 + import "../chunk-6YF7B6KW.js"; 21 + import "../chunk-OIUQ2WMN.js"; 22 + import "../chunk-DG4EBNDV.js"; 23 + import "../chunk-R65OZ4FV.js"; 24 + import "../chunk-3G4WUGDN.js"; 25 + import "../chunk-P3M4HQTD.js"; 26 + import "../chunk-NMCS5TQK.js"; 27 + import "../chunk-OIQMICML.js"; 28 + import "../chunk-UACRVUBF.js"; 29 + import "../chunk-77ZY4GQV.js"; 30 + import "../chunk-WBRIGWBU.js"; 31 + import "../chunk-5UTOUDDD.js"; 32 + import "../chunk-4MLZJ4ZD.js"; 33 + import "../chunk-YMPAQN44.js"; 34 + import "../chunk-U74YW6XS.js"; 35 + import "../chunk-VK5BTHYP.js"; 36 + import "../chunk-4EGXANKE.js"; 37 + import "../chunk-AISBWLUT.js"; 38 + import "../chunk-JBHW662S.js"; 39 + import "../chunk-GX3WPNEX.js"; 40 + import "../chunk-LSHUSEQ5.js"; 41 + import "../chunk-SSTS6DW7.js"; 42 + import "../chunk-HN4F5JEZ.js"; 43 + import "../chunk-3VP55W4C.js"; 44 + import "../chunk-ETCOFMH2.js"; 45 + import "../chunk-GTZIAKZS.js"; 46 + import "../chunk-AGNDISJF.js"; 47 + import "../chunk-EEUCFWD4.js"; 48 + import "../chunk-6DRHTH2U.js"; 49 + import "../chunk-CW32SP4O.js"; 50 + import "../chunk-VKEUU6QK.js"; 51 + import "../chunk-EEVL24MR.js"; 52 + import "../chunk-H4FCSW7J.js"; 53 + import "../chunk-EXNT6GPY.js"; 54 + import "../chunk-JZ7ERCQK.js"; 55 + import "../chunk-NT5H3ES3.js"; 56 + import "../chunk-YGHHNA5S.js"; 57 + import { 58 + B, 59 + T 60 + } from "../chunk-H46AZIKM.js"; 61 + import "../chunk-G56PUJUJ.js"; 62 + import { 63 + effect, 64 + signal 65 + } from "../chunk-IZOBPV2S.js"; 66 + import "../chunk-EJ2QF5QE.js"; 67 + import "../chunk-NCFHYTLD.js"; 68 + import "../chunk-DUCTMCPX.js"; 69 + import "../chunk-UGE3FKYA.js"; 70 + import { 71 + facetFromUrl 72 + } from "../chunk-QQ2VIQZY.js"; 73 + import { 74 + qi 75 + } from "../chunk-PUHBIZRM.js"; 76 + import { 77 + create 78 + } from "../chunk-4YB6QUPN.js"; 79 + import { 80 + __name, 81 + init_Buffer, 82 + init_process 83 + } from "../chunk-FZQXS3RE.js"; 84 + 85 + // facets/index.js 86 + init_Buffer(); 87 + init_process(); 88 + document.body.addEventListener( 89 + "click", 90 + /** 91 + * @param {MouseEvent} event 92 + */ 93 + async (event) => { 94 + const target = ( 95 + /** @type {HTMLElement} */ 96 + event.target 97 + ); 98 + const rel = target.getAttribute("rel"); 99 + if (!rel) return; 100 + const url = target.closest("li")?.getAttribute("data-url"); 101 + if (!url) return; 102 + const name = target.closest("li")?.getAttribute("data-name"); 103 + if (!name) return; 104 + switch (rel) { 105 + case "fork": { 106 + const facet = await facetFromUrl({ name, url }, { fetchHTML: true }); 107 + editFacet(facet); 108 + document.querySelector("#build")?.scrollIntoView(); 109 + break; 110 + } 111 + case "save": { 112 + const facet = await facetFromUrl({ name, url }, { fetchHTML: false }); 113 + const out = foundation_default.orchestrator.output(); 114 + out.facets.save([ 115 + ...out.facets.collection(), 116 + facet 117 + ]); 118 + break; 119 + } 120 + } 121 + } 122 + ); 123 + var listEl = document.querySelector("#list"); 124 + if (!listEl) throw new Error("List element not found"); 125 + var output = foundation_default.orchestrator.output(); 126 + effect(() => { 127 + const col = output.facets.collection().sort((a, b) => { 128 + return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()); 129 + }); 130 + const h = col.length ? T` 131 + <ul> 132 + ${col.map( 133 + (c) => T` 134 + <li style="margin-bottom: var(--space-2xs)"> 135 + <span>${c.name}</span> 136 + <div class="list-description"> 137 + <div style="margin-bottom: var(--space-2xs)"> 138 + ${c.url && !c.html ? T` 139 + <span class="with-icon"> 140 + <i class="ph-fill ph-binoculars"></i> 141 + <span>Tracking the original <a href="${c.url}">URL</a></span> 142 + </span> 143 + ` : T` 144 + <span class="with-icon"> 145 + <i class="ph-fill ph-code"></i> 146 + <span>Custom code</span> 147 + </span> 148 + `} 149 + </div> 150 + <div class="button-row"> 151 + <a href="facets/l/?id=${c.id}" class="button button--bg-twist-1"> 152 + <span class="with-icon"> 153 + <i class="ph-fill ph-globe"></i> Open 154 + </span> 155 + </a> 156 + <button 157 + class="button--bg-twist-1 button--subtle" 158 + @click="${() => editFacet(c)}" 159 + > 160 + <span class="with-icon"> 161 + <i class="ph-fill ph-cursor-text"></i> Edit 162 + </span> 163 + </button> 164 + <button 165 + class="button--bg-twist-2 button--subtle" 166 + @click="${deleteFacet({ 167 + id: c.id 168 + })}" 169 + > 170 + <span class="with-icon"> 171 + <i class="ph-fill ph-eraser"></i> Delete 172 + </span> 173 + </button> 174 + </div> 175 + </div> 176 + </li> 177 + ` 178 + )} 179 + </ul> 180 + ` : output.facets.state() === "loaded" ? emptyFacetsList : T` 181 + <i class="ph-bold ph-spinner-gap"></i> 182 + `; 183 + B(h, listEl); 184 + }); 185 + var emptyFacetsList = T` 186 + <p style="margin-bottom: 0;"> 187 + <i class="ph-fill ph-info"></i> You have not saved any facets yet. 188 + </p> 189 + `; 190 + function deleteFacet({ id }) { 191 + return () => { 192 + const c = confirm("Are you sure you want to delete this facet?"); 193 + if (!c) return; 194 + output.facets.save( 195 + output.facets.collection().filter((c2) => !(c2.id === id)) 196 + ); 197 + }; 198 + } 199 + __name(deleteFacet, "deleteFacet"); 200 + var $editingFacet = signal( 201 + /** @type {Facet | null} */ 202 + null 203 + ); 204 + var editorContainer = document.body.querySelector("#html-input-container"); 205 + if (!editorContainer) throw new Error("Editor container not found"); 206 + var editor = new EditorView({ 207 + parent: editorContainer, 208 + doc: ` 209 + <main> 210 + <h1 id="now-playing"> 211 + Waiting on tracks &amp; queue to load ... 212 + </h1> 213 + </main> 214 + 215 + <style> 216 + @import "./styles/base.css"; 217 + @import "./styles/diffuse/page.css"; 218 + </style> 219 + 220 + <script type="module"> 221 + import foundation from "./common/facets/foundation.js"; 222 + import { effect } from "./common/signal.js"; 223 + 224 + const components = foundation.features.fillQueueAutomatically(); 225 + const myHtmlElement = document.querySelector("#now-playing"); 226 + 227 + effect(() => { 228 + const currentlyPlaying = components.engine.queue.now(); 229 + if (currentlyPlaying && myHtmlElement) { 230 + myHtmlElement.innerText = \`\${currentlyPlaying.tags.artist} - \${currentlyPlaying.tags.title}\`; 231 + } 232 + }) 233 + <\/script> 234 + `.trim(), 235 + extensions: [ 236 + basicSetup, 237 + html(), 238 + css(), 239 + javascript(), 240 + autocompletion() 241 + ] 242 + }); 243 + document.querySelector("#build-form")?.addEventListener( 244 + "submit", 245 + onBuildSubmit 246 + ); 247 + async function onBuildSubmit(event) { 248 + event.preventDefault(); 249 + const nameEl = ( 250 + /** @type {HTMLInputElement | null} */ 251 + document.querySelector( 252 + "#name-input" 253 + ) 254 + ); 255 + const html2 = editor.state.doc.toString(); 256 + const cid = await create(85, new TextEncoder().encode(html2)); 257 + const name = nameEl?.value ?? "nameless"; 258 + const facet = $editingFacet.value ? { 259 + ...$editingFacet.value, 260 + cid, 261 + html: html2, 262 + name 263 + } : { 264 + $type: "sh.diffuse.output.facet", 265 + id: crypto.randomUUID(), 266 + cid, 267 + html: html2, 268 + name 269 + }; 270 + switch ( 271 + /** @type {any} */ 272 + event.submitter.name 273 + ) { 274 + case "save": 275 + await saveFacet(facet); 276 + break; 277 + case "save+open": 278 + await saveFacet(facet); 279 + globalThis.open(`./facets/l/?id=${facet.id}`, "blank"); 280 + break; 281 + } 282 + } 283 + __name(onBuildSubmit, "onBuildSubmit"); 284 + async function editFacet(ogFacet) { 285 + const facet = { ...ogFacet }; 286 + const nameEl = ( 287 + /** @type {HTMLInputElement | null} */ 288 + document.querySelector( 289 + "#name-input" 290 + ) 291 + ); 292 + if (!nameEl) return; 293 + document.querySelector("#build")?.scrollIntoView(); 294 + if (!facet.html && facet.url) { 295 + const html2 = await fetch(facet.url).then((res) => res.text()); 296 + const cid = await create(85, new TextEncoder().encode(html2)); 297 + facet.html = html2; 298 + facet.cid = cid; 299 + } 300 + $editingFacet.value = facet; 301 + nameEl.value = facet.name; 302 + editor.dispatch({ 303 + changes: { from: 0, to: editor.state.doc.length, insert: facet.html } 304 + }); 305 + } 306 + __name(editFacet, "editFacet"); 307 + async function saveFacet(facet) { 308 + const col = output.facets.collection(); 309 + const colWithoutId = col.filter((c) => c.id !== facet.id); 310 + const timestamp = qi.Now.zonedDateTimeISO().toString(); 311 + await output.facets.save([...colWithoutId, { 312 + ...facet, 313 + updatedAt: timestamp 314 + }]); 315 + } 316 + __name(saveFacet, "saveFacet"); 317 + 318 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import { Temporal } from \"@js-temporal/polyfill\";\nimport { html, render } from \"lit-html\";\n\nimport { basicSetup, EditorView } from \"codemirror\";\nimport { css as langCss } from \"@codemirror/lang-css\";\nimport { html as langHtml } from \"@codemirror/lang-html\";\nimport { javascript as langJs } from \"@codemirror/lang-javascript\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\n\nimport * as CID from \"@common/cid.js\";\nimport foundation from \"@common/facets/foundation.js\";\nimport { effect, signal } from \"@common/signal.js\";\nimport { facetFromUrl } from \"@common/facets/utils.js\";\n\n/**\n * @import {Facet} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// SAVE & FORK\n////////////////////////////////////////////\n\ndocument.body.addEventListener(\n \"click\",\n /**\n * @param {MouseEvent} event\n */\n async (event) => {\n const target = /** @type {HTMLElement} */ (event.target);\n const rel = target.getAttribute(\"rel\");\n if (!rel) return;\n\n const url = target.closest(\"li\")?.getAttribute(\"data-url\");\n if (!url) return;\n\n const name = target.closest(\"li\")?.getAttribute(\"data-name\");\n if (!name) return;\n\n switch (rel) {\n case \"fork\": {\n const facet = await facetFromUrl({ name, url }, { fetchHTML: true });\n editFacet(facet);\n document.querySelector(\"#build\")?.scrollIntoView();\n break;\n }\n case \"save\": {\n const facet = await facetFromUrl({ name, url }, { fetchHTML: false });\n const out = foundation.orchestrator.output();\n\n out.facets.save([\n ...out.facets.collection(),\n facet,\n ]);\n break;\n }\n }\n },\n);\n\n////////////////////////////////////////////\n// YOUR COLLECTION\n////////////////////////////////////////////\n\n/** @type {HTMLElement | null} */\nconst listEl = document.querySelector(\"#list\");\nif (!listEl) throw new Error(\"List element not found\");\n\nconst output = foundation.orchestrator.output();\n\neffect(() => {\n const col = output.facets.collection().sort((a, b) => {\n return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase());\n });\n\n const h = col.length\n ? html`\n <ul>\n ${col.map((c) =>\n html`\n <li style=\"margin-bottom: var(--space-2xs)\">\n <span>${c.name}</span>\n <div class=\"list-description\">\n <div style=\"margin-bottom: var(--space-2xs)\">\n ${c.url && !c.html\n ? html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-binoculars\"></i>\n <span>Tracking the original <a href=\"${c\n .url}\">URL</a></span>\n </span>\n `\n : html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-code\"></i>\n <span>Custom code</span>\n </span>\n `}\n </div>\n <div class=\"button-row\">\n <a href=\"facets/l/?id=${c\n .id}\" class=\"button button--bg-twist-1\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-globe\"></i> Open\n </span>\n </a>\n <button\n class=\"button--bg-twist-1 button--subtle\"\n @click=\"${() => editFacet(c)}\"\n >\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-cursor-text\"></i> Edit\n </span>\n </button>\n <button\n class=\"button--bg-twist-2 button--subtle\"\n @click=\"${deleteFacet({\n id: c.id,\n })}\"\n >\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-eraser\"></i> Delete\n </span>\n </button>\n </div>\n </div>\n </li>\n `\n )}\n </ul>\n `\n : output.facets.state() === \"loaded\"\n ? emptyFacetsList\n : html`\n <i class=\"ph-bold ph-spinner-gap\"></i>\n `;\n\n render(h, listEl);\n});\n\nconst emptyFacetsList = html`\n <p style=\"margin-bottom: 0;\">\n <i class=\"ph-fill ph-info\"></i> You have not saved any facets yet.\n </p>\n`;\n\n/**\n * @param {{ id: string }} _\n */\nfunction deleteFacet({ id }) {\n return () => {\n const c = confirm(\"Are you sure you want to delete this facet?\");\n if (!c) return;\n\n output.facets.save(\n output.facets.collection().filter((c) => !(c.id === id)),\n );\n };\n}\n\n////////////////////////////////////////////\n// BUILD\n////////////////////////////////////////////\n\nconst $editingFacet = signal(/** @type {Facet | null} */ (null));\n\n// Code editor\nconst editorContainer = document.body.querySelector(\"#html-input-container\");\nif (!editorContainer) throw new Error(\"Editor container not found\");\n\nconst editor = new EditorView({\n parent: editorContainer,\n doc: `\n<main>\n <h1 id=\"now-playing\">\n Waiting on tracks &amp; queue to load ...\n </h1>\n</main>\n\n<style>\n @import \"./styles/base.css\";\n @import \"./styles/diffuse/page.css\";\n</style>\n\n<script type=\"module\">\n import foundation from \"./common/facets/foundation.js\";\n import { effect } from \"./common/signal.js\";\n\n const components = foundation.features.fillQueueAutomatically();\n const myHtmlElement = document.querySelector(\"#now-playing\");\n\n effect(() => {\n const currentlyPlaying = components.engine.queue.now();\n if (currentlyPlaying && myHtmlElement) {\n myHtmlElement.innerText = \\`\\$\\{currentlyPlaying.tags.artist} - \\$\\{currentlyPlaying.tags.title}\\`;\n }\n })\n</script>\n `.trim(),\n extensions: [\n basicSetup,\n langHtml(),\n langCss(),\n langJs(),\n autocompletion(),\n ],\n});\n\n// Form submit\ndocument.querySelector(\"#build-form\")?.addEventListener(\n \"submit\",\n onBuildSubmit,\n);\n\n/**\n * @param {Event} event\n */\nasync function onBuildSubmit(event) {\n event.preventDefault();\n\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n const html = editor.state.doc.toString();\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n const name = nameEl?.value ?? \"nameless\";\n\n /** @type {Facet} */\n const facet = $editingFacet.value\n ? {\n ...$editingFacet.value,\n cid,\n html,\n name,\n }\n : {\n $type: \"sh.diffuse.output.facet\",\n id: crypto.randomUUID(),\n cid,\n html,\n name,\n };\n\n switch (/** @type {any} */ (event).submitter.name) {\n case \"save\":\n await saveFacet(facet);\n break;\n case \"save+open\":\n await saveFacet(facet);\n globalThis.open(`./facets/l/?id=${facet.id}`, \"blank\");\n break;\n }\n}\n\n/**\n * @param {Facet} ogFacet\n */\nasync function editFacet(ogFacet) {\n const facet = { ...ogFacet };\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n if (!nameEl) return;\n\n // Scroll to builder\n document.querySelector(\"#build\")?.scrollIntoView();\n\n // Make sure HTML is loaded\n if (!facet.html && facet.url) {\n const html = await fetch(facet.url).then((res) => res.text());\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n\n facet.html = html;\n facet.cid = cid;\n }\n\n $editingFacet.value = facet;\n nameEl.value = facet.name;\n\n editor.dispatch({\n changes: { from: 0, to: editor.state.doc.length, insert: facet.html },\n });\n}\n\n/**\n * @param {Facet} facet\n */\nasync function saveFacet(facet) {\n const col = output.facets.collection();\n const colWithoutId = col.filter((c) => c.id !== facet.id);\n const timestamp = Temporal.Now.zonedDateTimeISO().toString();\n\n await output.facets.save([...colWithoutId, {\n ...facet,\n updatedAt: timestamp,\n }]);\n}\n"],"mappings":"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","names":["c","html"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/facets/index.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/l/index.html
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/facets/l/index.html
+125
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-T6K5PZ3T.js"; 4 + import "../../chunk-M4NQYVPY.js"; 5 + import "../../chunk-4XYXC3TC.js"; 6 + import "../../chunk-CTVRRF4G.js"; 7 + import "../../chunk-IR27WFXT.js"; 8 + import "../../chunk-C7BSJ3AC.js"; 9 + import "../../chunk-CPS76EE2.js"; 10 + import "../../chunk-MA2JKS5M.js"; 11 + import "../../chunk-3SF5BNF4.js"; 12 + import "../../chunk-6YF7B6KW.js"; 13 + import "../../chunk-OIUQ2WMN.js"; 14 + import "../../chunk-DG4EBNDV.js"; 15 + import "../../chunk-R65OZ4FV.js"; 16 + import "../../chunk-3G4WUGDN.js"; 17 + import "../../chunk-P3M4HQTD.js"; 18 + import "../../chunk-NMCS5TQK.js"; 19 + import "../../chunk-OIQMICML.js"; 20 + import "../../chunk-UACRVUBF.js"; 21 + import "../../chunk-77ZY4GQV.js"; 22 + import "../../chunk-WBRIGWBU.js"; 23 + import "../../chunk-5UTOUDDD.js"; 24 + import "../../chunk-4MLZJ4ZD.js"; 25 + import "../../chunk-YMPAQN44.js"; 26 + import "../../chunk-U74YW6XS.js"; 27 + import "../../chunk-VK5BTHYP.js"; 28 + import "../../chunk-4EGXANKE.js"; 29 + import "../../chunk-AISBWLUT.js"; 30 + import "../../chunk-JBHW662S.js"; 31 + import "../../chunk-GX3WPNEX.js"; 32 + import "../../chunk-LSHUSEQ5.js"; 33 + import "../../chunk-SSTS6DW7.js"; 34 + import "../../chunk-HN4F5JEZ.js"; 35 + import "../../chunk-3VP55W4C.js"; 36 + import "../../chunk-ETCOFMH2.js"; 37 + import "../../chunk-GTZIAKZS.js"; 38 + import "../../chunk-AGNDISJF.js"; 39 + import "../../chunk-EEUCFWD4.js"; 40 + import "../../chunk-6DRHTH2U.js"; 41 + import "../../chunk-CW32SP4O.js"; 42 + import "../../chunk-VKEUU6QK.js"; 43 + import "../../chunk-EEVL24MR.js"; 44 + import "../../chunk-H4FCSW7J.js"; 45 + import "../../chunk-EXNT6GPY.js"; 46 + import "../../chunk-JZ7ERCQK.js"; 47 + import "../../chunk-NT5H3ES3.js"; 48 + import "../../chunk-YGHHNA5S.js"; 49 + import "../../chunk-H46AZIKM.js"; 50 + import "../../chunk-G56PUJUJ.js"; 51 + import { 52 + effect 53 + } from "../../chunk-IZOBPV2S.js"; 54 + import "../../chunk-EJ2QF5QE.js"; 55 + import "../../chunk-NCFHYTLD.js"; 56 + import "../../chunk-DUCTMCPX.js"; 57 + import "../../chunk-UGE3FKYA.js"; 58 + import { 59 + create 60 + } from "../../chunk-4YB6QUPN.js"; 61 + import { 62 + __name, 63 + init_Buffer, 64 + init_process 65 + } from "../../chunk-FZQXS3RE.js"; 66 + 67 + // facets/l/index.js 68 + init_Buffer(); 69 + init_process(); 70 + var output = foundation_default.orchestrator.output(); 71 + var docUrl = new URL(document.location.href); 72 + var id = docUrl.searchParams.get("id"); 73 + var cid = docUrl.searchParams.get("cid"); 74 + var name = docUrl.searchParams.get("name"); 75 + var url = docUrl.searchParams.get("url"); 76 + var containerNull = document.querySelector("#container"); 77 + if (!containerNull) throw new Error("Container not found"); 78 + var container = ( 79 + /** @type {HTMLDivElement} */ 80 + containerNull 81 + ); 82 + var loadedCid = null; 83 + effect(async () => { 84 + const collection = output.facets.collection(); 85 + if (output.facets.state() !== "loaded") return; 86 + let facet; 87 + if (id) { 88 + facet = collection.find((c) => c.id === id); 89 + } else if (cid) { 90 + facet = collection.find((c) => c.cid === cid); 91 + } else if (name) { 92 + facet = collection.find((c) => c.name === name); 93 + } else if (url) { 94 + const c = { 95 + $type: "sh.diffuse.output.facet", 96 + id: crypto.randomUUID(), 97 + name: "tryout", 98 + url 99 + }; 100 + facet = c; 101 + } 102 + if (!facet) { 103 + console.error("Facet not found"); 104 + return; 105 + } 106 + if (!facet.html && facet.url) { 107 + const html = await fetch(facet.url).then((res) => res.text()); 108 + const cid2 = await create(85, new TextEncoder().encode(html)); 109 + facet.html = html; 110 + facet.cid = cid2; 111 + } 112 + if (facet.cid === loadedCid) return; 113 + loadedCid = facet.cid ?? null; 114 + loadIntoContainer(facet); 115 + }); 116 + function loadIntoContainer(facet) { 117 + const range = document.createRange(); 118 + range.selectNode(container); 119 + const documentFragment = range.createContextualFragment(facet.html ?? ""); 120 + container.innerHTML = ""; 121 + container.append(documentFragment); 122 + } 123 + __name(loadIntoContainer, "loadIntoContainer"); 124 + 125 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/l/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import * as CID from \"@common/cid.js\";\nimport foundation from \"@common/facets/foundation.js\";\nimport { effect } from \"@common/signal.js\";\n\n/**\n * @import {Facet} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// OUTPUT\n////////////////////////////////////////////\n\nconst output = foundation.orchestrator.output();\n\n////////////////////////////////////////////\n// URL PARAMS\n////////////////////////////////////////////\n\nconst docUrl = new URL(document.location.href);\n\nconst id = docUrl.searchParams.get(\"id\");\nconst cid = docUrl.searchParams.get(\"cid\");\nconst name = docUrl.searchParams.get(\"name\");\nconst url = docUrl.searchParams.get(\"url\");\n\n////////////////////////////////////////////\n// LOAD\n////////////////////////////////////////////\n\nconst containerNull = document.querySelector(\"#container\");\nif (!containerNull) throw new Error(\"Container not found\");\n\nconst container = /** @type {HTMLDivElement} */ (containerNull);\n\n/** @type {string | null} */\nlet loadedCid = null;\n\neffect(async () => {\n const collection = output.facets.collection();\n if (output.facets.state() !== \"loaded\") return;\n\n let facet;\n\n if (id) {\n facet = collection.find((c) => c.id === id);\n } else if (cid) {\n facet = collection.find((c) => c.cid === cid);\n } else if (name) {\n facet = collection.find((c) => c.name === name);\n } else if (url) {\n /** @type {Facet} */\n const c = {\n $type: \"sh.diffuse.output.facet\",\n id: crypto.randomUUID(),\n name: \"tryout\",\n url,\n };\n\n facet = c;\n }\n\n // TODO: Message that facet was not found\n if (!facet) {\n console.error(\"Facet not found\");\n return;\n }\n\n // Make sure HTML is loaded\n // TODO: Handle URL loading error\n if (!facet.html && facet.url) {\n const html = await fetch(facet.url).then((res) => res.text());\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n\n facet.html = html;\n facet.cid = cid;\n }\n\n if (facet.cid === loadedCid) return;\n\n loadedCid = facet.cid ?? null;\n loadIntoContainer(facet);\n});\n\n/**\n * @param {Facet} facet\n */\nfunction loadIntoContainer(facet) {\n // TODO: Validate if CID matches HTML\n\n const range = document.createRange();\n range.selectNode(container);\n const documentFragment = range.createContextualFragment(facet.html ?? \"\");\n\n container.innerHTML = \"\";\n container.append(documentFragment);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAYA,IAAM,SAAS,mBAAW,aAAa,OAAO;AAM9C,IAAM,SAAS,IAAI,IAAI,SAAS,SAAS,IAAI;AAE7C,IAAM,KAAK,OAAO,aAAa,IAAI,IAAI;AACvC,IAAM,MAAM,OAAO,aAAa,IAAI,KAAK;AACzC,IAAM,OAAO,OAAO,aAAa,IAAI,MAAM;AAC3C,IAAM,MAAM,OAAO,aAAa,IAAI,KAAK;AAMzC,IAAM,gBAAgB,SAAS,cAAc,YAAY;AACzD,IAAI,CAAC,cAAe,OAAM,IAAI,MAAM,qBAAqB;AAEzD,IAAM;AAAA;AAAA,EAA2C;AAAA;AAGjD,IAAI,YAAY;AAEhB,OAAO,YAAY;AACjB,QAAM,aAAa,OAAO,OAAO,WAAW;AAC5C,MAAI,OAAO,OAAO,MAAM,MAAM,SAAU;AAExC,MAAI;AAEJ,MAAI,IAAI;AACN,YAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EAC5C,WAAW,KAAK;AACd,YAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAAA,EAC9C,WAAW,MAAM;AACf,YAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAChD,WAAW,KAAK;AAEd,UAAM,IAAI;AAAA,MACR,OAAO;AAAA,MACP,IAAI,OAAO,WAAW;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,IACF;AAEA,YAAQ;AAAA,EACV;AAGA,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,iBAAiB;AAC/B;AAAA,EACF;AAIA,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK;AAC5B,UAAM,OAAO,MAAM,MAAM,MAAM,GAAG,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC5D,UAAMA,OAAM,MAAU,OAAO,IAAM,IAAI,YAAY,EAAE,OAAO,IAAI,CAAC;AAEjE,UAAM,OAAO;AACb,UAAM,MAAMA;AAAA,EACd;AAEA,MAAI,MAAM,QAAQ,UAAW;AAE7B,cAAY,MAAM,OAAO;AACzB,oBAAkB,KAAK;AACzB,CAAC;AAKD,SAAS,kBAAkB,OAAO;AAGhC,QAAM,QAAQ,SAAS,YAAY;AACnC,QAAM,WAAW,SAAS;AAC1B,QAAM,mBAAmB,MAAM,yBAAyB,MAAM,QAAQ,EAAE;AAExE,YAAU,YAAY;AACtB,YAAU,OAAO,gBAAgB;AACnC;AATS;","names":["cid"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/facets/l/index.js.map"}
+121
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/tools/auto-queue.html.txt
··· 1 + <main> 2 + <div class="panel"> 3 + <div class="row"> 4 + <button id="repeat" title="Toggle repeat"> 5 + <span class="with-icon"><i class="ph-bold ph-repeat"></i> Repeat</span> 6 + </button> 7 + <button id="shuffle" title="Toggle shuffle"> 8 + <span class="with-icon"><i class="ph-bold ph-shuffle"></i> Shuffle</span> 9 + </button> 10 + </div> 11 + <hr /> 12 + <div class="row"> 13 + <label class="with-icon" for="playlist"> 14 + <i class="ph-bold ph-playlist"></i> 15 + <select id="playlist"> 16 + <option value="">All tracks</option> 17 + </select> 18 + </label> 19 + </div> 20 + </div> 21 + </main> 22 + 23 + <style> 24 + @import "./styles/base.css"; 25 + @import "./styles/vendor/phosphor/bold/style.css"; 26 + @import "./styles/wireframe/ui.css"; 27 + 28 + body { 29 + display: flex; 30 + align-items: center; 31 + justify-content: center; 32 + height: 100dvh; 33 + } 34 + 35 + main { 36 + padding: var(--space-md); 37 + } 38 + 39 + label { 40 + flex: 1; 41 + letter-spacing: var(--leading-relaxed); 42 + text-transform: uppercase; 43 + } 44 + 45 + label select { 46 + flex: 1; 47 + } 48 + </style> 49 + 50 + <script type="module"> 51 + import foundation from "./common/facets/foundation.js"; 52 + import { computed, effect } from "./common/signal.js"; 53 + 54 + const ACTIVE_CLASS = "button--active"; 55 + 56 + // Setup 57 + foundation.features.fillQueueAutomatically(); 58 + foundation.features.processInputs(); 59 + 60 + const queue = foundation.engine.queue(); 61 + const repeatShuffle = foundation.engine.repeatShuffle(); 62 + const scope = foundation.engine.scope(); 63 + const output = foundation.orchestrator.output(); 64 + 65 + // Elements 66 + const repeatBtn = document.querySelector("#repeat"); 67 + const shuffleBtn = document.querySelector("#shuffle"); 68 + const playlistSelect = document.querySelector("#playlist"); 69 + 70 + // Repeat & Shuffle state 71 + effect(() => { 72 + repeatBtn.classList.toggle(ACTIVE_CLASS, repeatShuffle.repeat()); 73 + }); 74 + 75 + effect(() => { 76 + shuffleBtn.classList.toggle(ACTIVE_CLASS, repeatShuffle.shuffle()); 77 + }); 78 + 79 + // Actions 80 + repeatBtn.onclick = () => { 81 + repeatShuffle.setRepeat(!repeatShuffle.repeat()); 82 + }; 83 + 84 + shuffleBtn.onclick = () => { 85 + repeatShuffle.setShuffle(!repeatShuffle.shuffle()); 86 + }; 87 + 88 + // Playlist state 89 + effect(() => { 90 + const playlists = output.playlists.collection().sort((a, b) => 91 + a.name.localeCompare(b.name) 92 + ); 93 + 94 + const currentId = scope.playlistId(); 95 + const ordered = playlists.filter((p) => !p.unordered); 96 + const unordered = playlists.filter((p) => p.unordered); 97 + 98 + playlistSelect.innerHTML = `<option value="">All tracks</option>`; 99 + 100 + for (const [label, group] of [["Ordered", ordered], ["Unordered", unordered]]) { 101 + if (group.length === 0) continue; 102 + 103 + const optgroup = document.createElement("optgroup"); 104 + optgroup.label = label; 105 + 106 + for (const playlist of group) { 107 + const option = document.createElement("option"); 108 + option.value = playlist.id; 109 + option.textContent = playlist.name; 110 + option.selected = playlist.id === currentId; 111 + optgroup.appendChild(option); 112 + } 113 + 114 + playlistSelect.appendChild(optgroup); 115 + } 116 + }); 117 + 118 + playlistSelect.onchange = () => { 119 + scope.setPlaylistId(playlistSelect.value.length ? playlistSelect.value : undefined); 120 + }; 121 + </script>
+195
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/tools/v3-import.html.txt
··· 1 + <main> 2 + <div class="panel"> 3 + <p> 4 + Import data from the previous version of Diffuse (v3). Upload the snapshot JSON file you 5 + exported. 6 + </p> 7 + <hr /> 8 + <div class="row"> 9 + <label class="with-icon" for="file"> 10 + <i class="ph-bold ph-upload"></i> 11 + <input id="file" type="file" accept=".json,application/json" /> 12 + </label> 13 + </div> 14 + <hr /> 15 + <div class="row"> 16 + <button id="import-favourites" disabled> 17 + <span class="with-icon"><i class="ph-fill ph-star"></i> Import favourites</span> 18 + </button> 19 + </div> 20 + <div class="row"> 21 + <button id="import-playlists" disabled> 22 + <span class="with-icon"><i class="ph-bold ph-playlist"></i> Import playlists</span> 23 + </button> 24 + </div> 25 + <div id="status" class="status" hidden></div> 26 + </div> 27 + </main> 28 + 29 + <style> 30 + @import "./styles/base.css"; 31 + @import "./styles/vendor/phosphor/bold/style.css"; 32 + @import "./styles/vendor/phosphor/fill/style.css"; 33 + @import "./styles/wireframe/ui.css"; 34 + 35 + body { 36 + display: flex; 37 + align-items: center; 38 + justify-content: center; 39 + height: 100dvh; 40 + } 41 + 42 + main { 43 + padding: var(--space-md); 44 + } 45 + 46 + p { 47 + line-height: var(--leading-relaxed); 48 + max-width: 42ch; 49 + } 50 + 51 + label { 52 + flex: 1; 53 + } 54 + 55 + input[type="file"] { 56 + flex: 1; 57 + } 58 + 59 + .status { 60 + margin-top: var(--space-sm); 61 + font-size: var(--text-sm); 62 + } 63 + 64 + .status--success { 65 + color: var(--accent); 66 + 67 + @media (prefers-color-scheme: dark) { 68 + color: var(--accent-twist-4); 69 + } 70 + } 71 + 72 + .status--error { 73 + color: var(--accent-twist-5); 74 + 75 + @media (prefers-color-scheme: dark) { 76 + color: var(--accent-twist-3); 77 + } 78 + } 79 + </style> 80 + 81 + <script type="module"> 82 + import foundation from "./common/facets/foundation.js"; 83 + 84 + // Setup 85 + foundation.features.processInputs(); 86 + 87 + const favourites = foundation.orchestrator.favourites(); 88 + const output = foundation.orchestrator.output(); 89 + 90 + // Elements 91 + const fileInput = document.querySelector("#file"); 92 + const importFavouritesBtn = document.querySelector("#import-favourites"); 93 + const importPlaylistsBtn = document.querySelector("#import-playlists"); 94 + const statusEl = document.querySelector("#status"); 95 + 96 + // Parsed data 97 + let json = null; 98 + 99 + /** 100 + * Show a status message. 101 + * @param {string} message 102 + * @param {"success" | "error"} type 103 + */ 104 + function showStatus(message, type) { 105 + statusEl.textContent = message; 106 + statusEl.className = `status status--${type}`; 107 + statusEl.hidden = false; 108 + } 109 + 110 + // Parse file on selection 111 + fileInput.onchange = async () => { 112 + const file = fileInput.files?.[0]; 113 + 114 + json = null; 115 + statusEl.hidden = true; 116 + importFavouritesBtn.disabled = true; 117 + importPlaylistsBtn.disabled = true; 118 + 119 + if (!file) return; 120 + 121 + try { 122 + json = JSON.parse(await file.text()); 123 + } catch (err) { 124 + console.error("Failed to parse JSON:", err); 125 + showStatus(`Failed to parse JSON: ${err.message}`, "error"); 126 + return; 127 + } 128 + 129 + if (json.favourites?.data?.length > 0) { 130 + importFavouritesBtn.disabled = false; 131 + } 132 + 133 + if (json.playlists?.data?.length > 0) { 134 + importPlaylistsBtn.disabled = false; 135 + } 136 + }; 137 + 138 + // Import favourites on button click 139 + importFavouritesBtn.onclick = async () => { 140 + const items = json?.favourites?.data; 141 + if (!items || items.length === 0) return; 142 + 143 + try { 144 + const tracks = items.map((item) => ({ 145 + tags: { 146 + artist: item.artist ?? "", 147 + title: item.title ?? "", 148 + }, 149 + })); 150 + 151 + await favourites.include(tracks); 152 + showStatus(`Imported ${tracks.length} favourite(s).`, "success"); 153 + } catch (err) { 154 + console.error("Import failed:", err); 155 + showStatus(`Import failed: ${err.message}`, "error"); 156 + } 157 + }; 158 + 159 + // Import playlists on button click 160 + importPlaylistsBtn.onclick = async () => { 161 + const items = json?.playlists?.data; 162 + if (!items || items.length === 0) return; 163 + 164 + try { 165 + const now = new Date().toISOString(); 166 + const existing = output.playlists.collection() ?? []; 167 + 168 + const newPlaylists = items 169 + .map((item) => ({ 170 + $type: "sh.diffuse.output.playlist", 171 + id: crypto.randomUUID(), 172 + name: item.name ?? "Untitled", 173 + unordered: !!item.collection, 174 + items: (item.tracks ?? []).map((track) => ({ 175 + criteria: [ 176 + { field: "tags.album", value: track.album ?? "", transformations: ["toLowerCase"] }, 177 + { field: "tags.artist", value: track.artist ?? "", transformations: ["toLowerCase"] }, 178 + { field: "tags.title", value: track.title ?? "", transformations: ["toLowerCase"] }, 179 + ], 180 + })), 181 + createdAt: now, 182 + updatedAt: now, 183 + })) 184 + .filter((playlist) => { 185 + return existing.find((p) => p.name === playlist.name) === undefined; 186 + }); 187 + 188 + await output.playlists.save([...existing, ...newPlaylists]); 189 + showStatus(`Imported ${newPlaylists.length} playlist(s).`, "success"); 190 + } catch (err) { 191 + console.error("Import failed:", err); 192 + showStatus(`Import failed: ${err.message}`, "error"); 193 + } 194 + }; 195 + </script>
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/favicon-16x16.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-16x16.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/favicon-32x32.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-32x32.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/favicon.ico
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon.ico
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/fonts/CommitMonoVariable.woff2
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/CommitMonoVariable.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/fonts/InterVariable-Italic.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable-Italic.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/fonts/InterVariable.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/fonts/ms_sans_serif.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/fonts/ms_sans_serif_bold.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/1.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/1.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/10.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/10.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/11.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/11.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/12.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/12.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/13.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/13.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/14.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/14.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/15.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/15.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/16.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/16.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/17.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/17.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/18.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/18.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/19.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/19.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/2.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/2.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/20.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/20.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/21.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/21.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/22.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/22.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/23.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/23.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/24.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/24.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/25.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/25.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/26.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/26.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/27.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/27.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/28.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/28.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/29.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/29.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/3.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/3.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/30.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/30.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/4.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/4.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/5.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/5.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/6.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/6.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/7.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/7.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/8.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/8.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/9.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/9.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/1.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/1.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/10.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/10.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/11.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/11.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/12.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/12.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/13.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/13.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/14.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/14.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/15.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/15.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/16.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/16.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/17.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/17.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/18.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/18.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/19.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/19.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/2.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/2.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/20.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/20.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/21.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/21.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/22.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/22.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/23.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/23.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/24.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/24.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/25.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/25.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/26.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/26.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/27.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/27.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/28.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/28.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/29.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/29.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/3.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/3.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/30.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/30.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/4.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/4.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/5.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/5.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/6.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/6.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/7.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/7.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/8.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/8.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/background/thumbnails/9.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/9.jpg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/diffuse-current.svg
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/diffuse-current.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/diffuse-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-dark.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/diffuse-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-grey.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/diffuse-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-light.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/diffuse__icon-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-dark.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/diffuse__icon-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-grey.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/diffuse__icon-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-light.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icon-square-ws.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square-ws.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icon-square.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icon.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/catalog-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/catalog-1.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/cd_audio_cd_a-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/cd_audio_cd_a-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-2.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/cd_audio_cd_a-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/cd_audio_cd_a-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/cd_drive-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/cd_drive_purple-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive_purple-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/channels-2.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/check-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/check-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/computer_sound-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_sound-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/computer_user_pencil-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_user_pencil-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/connected_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/connected_world-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_admin_tools-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_admin_tools-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-5.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-2.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_channels-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_closed-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_closed-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_control_panel-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-2.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_control_panel-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_explorer-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_explorer-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-5.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_favorites-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-2.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_favorites-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_net_web-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_net_web-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_network_conn-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_network_conn-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-5.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/gears-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/gears-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/globe_map-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/globe_map-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/help_book_big-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/help_book_big-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/installer-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/installer_generic_old-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer_generic_old-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/loudspeaker_wave-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/loudspeaker_wave-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/magnifying_glass-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/magnifying_glass_4-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass_4-1.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/media_player-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/media_player_stream_no.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player_stream_no.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/ms_dos-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/ms_dos-1.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/msg_error-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_error-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/msg_information-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_information-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/msg_question-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_question-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/msg_warning-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_warning-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/multimedia-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/multimedia-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/network_drive_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/network_drive_world-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/no-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/no-1.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/restrict-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/restrict-1.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/search_computer-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_computer-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/search_server-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_server-1.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/search_web-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_web-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/settings_gear-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/settings_gear-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-2.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/tip.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/tip.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/utopia_smiley.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/utopia_smiley.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/winamp2-32x32.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/winamp2-32x32.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/windows-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/windows-0.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/world-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-2.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/world-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-4.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/images/icons/windows_98/world_network_directories-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world_network_directories-3.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/index.html
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/index.html
+142
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/index.js
··· 1 + import { 2 + GROUP 3 + } from "./chunk-T6K5PZ3T.js"; 4 + import "./chunk-M4NQYVPY.js"; 5 + import { 6 + element_default as element_default4 7 + } from "./chunk-4XYXC3TC.js"; 8 + import "./chunk-CTVRRF4G.js"; 9 + import "./chunk-IR27WFXT.js"; 10 + import "./chunk-C7BSJ3AC.js"; 11 + import "./chunk-CPS76EE2.js"; 12 + import "./chunk-MA2JKS5M.js"; 13 + import { 14 + element_default as element_default3 15 + } from "./chunk-3SF5BNF4.js"; 16 + import "./chunk-6YF7B6KW.js"; 17 + import "./chunk-OIUQ2WMN.js"; 18 + import "./chunk-DG4EBNDV.js"; 19 + import "./chunk-R65OZ4FV.js"; 20 + import "./chunk-3G4WUGDN.js"; 21 + import "./chunk-P3M4HQTD.js"; 22 + import "./chunk-NMCS5TQK.js"; 23 + import "./chunk-OIQMICML.js"; 24 + import "./chunk-UACRVUBF.js"; 25 + import "./chunk-77ZY4GQV.js"; 26 + import "./chunk-WBRIGWBU.js"; 27 + import "./chunk-5UTOUDDD.js"; 28 + import { 29 + element_default as element_default5 30 + } from "./chunk-4MLZJ4ZD.js"; 31 + import "./chunk-YMPAQN44.js"; 32 + import "./chunk-U74YW6XS.js"; 33 + import "./chunk-VK5BTHYP.js"; 34 + import { 35 + element_default as element_default2 36 + } from "./chunk-4EGXANKE.js"; 37 + import "./chunk-AISBWLUT.js"; 38 + import "./chunk-JBHW662S.js"; 39 + import "./chunk-GX3WPNEX.js"; 40 + import "./chunk-LSHUSEQ5.js"; 41 + import "./chunk-SSTS6DW7.js"; 42 + import "./chunk-HN4F5JEZ.js"; 43 + import "./chunk-3VP55W4C.js"; 44 + import "./chunk-ETCOFMH2.js"; 45 + import "./chunk-GTZIAKZS.js"; 46 + import "./chunk-AGNDISJF.js"; 47 + import "./chunk-EEUCFWD4.js"; 48 + import "./chunk-6DRHTH2U.js"; 49 + import "./chunk-CW32SP4O.js"; 50 + import { 51 + element_default 52 + } from "./chunk-VKEUU6QK.js"; 53 + import "./chunk-EEVL24MR.js"; 54 + import "./chunk-H4FCSW7J.js"; 55 + import "./chunk-EXNT6GPY.js"; 56 + import "./chunk-JZ7ERCQK.js"; 57 + import "./chunk-NT5H3ES3.js"; 58 + import "./chunk-YGHHNA5S.js"; 59 + import "./chunk-H46AZIKM.js"; 60 + import "./chunk-G56PUJUJ.js"; 61 + import "./chunk-IZOBPV2S.js"; 62 + import "./chunk-EJ2QF5QE.js"; 63 + import "./chunk-NCFHYTLD.js"; 64 + import "./chunk-DUCTMCPX.js"; 65 + import "./chunk-UGE3FKYA.js"; 66 + import { 67 + __name, 68 + init_Buffer, 69 + init_process 70 + } from "./chunk-FZQXS3RE.js"; 71 + 72 + // index.js 73 + init_Buffer(); 74 + init_process(); 75 + var s3 = new element_default2(); 76 + var input = new element_default(); 77 + input.setAttribute("group", GROUP); 78 + input.append(s3); 79 + var output = new element_default3(); 80 + output.setAttribute("group", GROUP); 81 + var metadataProcessor = new element_default4(); 82 + metadataProcessor.setAttribute("group", GROUP); 83 + document.body.append(input, output, metadataProcessor); 84 + var pto = new element_default5(); 85 + pto.setAttribute("group", GROUP); 86 + pto.setAttribute("input-selector", input.selector); 87 + pto.setAttribute("output-selector", output.selector); 88 + pto.setAttribute("metadata-processor-selector", metadataProcessor.selector); 89 + document.body.append(pto); 90 + var addDemoBtn = document.querySelector("#add-sample-content"); 91 + async function addSampleContent() { 92 + if (!addDemoBtn) return; 93 + addDemoBtn.setAttribute("disabled", ""); 94 + addDemoBtn.innerHTML = `<span> 95 + <i class="ph-fill ph-hourglass-medium"></i> 96 + Adding source 97 + </span>`; 98 + const demo = await s3.demo(); 99 + const tracks = output.tracks.collection(); 100 + await output.tracks.save([...tracks, demo.track]); 101 + addDemoBtn.innerHTML = `<span> 102 + <i class="ph-fill ph-hourglass-medium"></i> 103 + Processing source 104 + </span>`; 105 + await pto.process(); 106 + addDemoBtn.innerHTML = `<span> 107 + <i class="ph-fill ph-check-fat"></i> Added 108 + </span>`; 109 + } 110 + __name(addSampleContent, "addSampleContent"); 111 + addDemoBtn?.addEventListener("click", addSampleContent); 112 + if (document.location.hostname.endsWith("diffuse.sh")) { 113 + document.querySelectorAll("#status").forEach(async (status) => { 114 + const versionOrCid = document.location.pathname.slice(1).split("/")[0]?.toLowerCase() ?? ""; 115 + const usesCid = versionOrCid.startsWith("bafy"); 116 + const { default: artifacts } = await import(`${document.location.origin}/artifacts.json`, { with: { type: "json" } }); 117 + const lastArtifact = Object.values(artifacts).reverse()[0]; 118 + const isLatest = usesCid ? versionOrCid === lastArtifact.cid : versionOrCid === lastArtifact.version; 119 + status.querySelectorAll(".ph-spinner").forEach((icon) => { 120 + icon.parentElement?.classList.add("hidden"); 121 + setTimeout(() => { 122 + icon.parentElement?.classList.remove("animate-spin"); 123 + icon.classList.remove("ph-spinner"); 124 + icon.classList.add("ph-arrow-fat-lines-up"); 125 + }, 500); 126 + }); 127 + status.querySelectorAll(`[href="/latest/"]`).forEach((a) => { 128 + if (usesCid) a.setAttribute("href", "/latest/hash/"); 129 + if (!isLatest) { 130 + setTimeout(() => { 131 + a.classList.remove("hidden"); 132 + }, 750); 133 + } 134 + }); 135 + }); 136 + } else { 137 + document.querySelectorAll("#status").forEach((status) => { 138 + status.remove(); 139 + }); 140 + } 141 + 142 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import { GROUP } from \"@common/facets/foundation.js\";\n\nimport InputConfigurator from \"@components/configurator/input/element.js\";\nimport MetadataProcessor from \"@components/processor/metadata/element.js\";\nimport OutputOrchestrator from \"@components/orchestrator/output/element.js\";\nimport ProcessTracksOrchestrator from \"@components/orchestrator/process-tracks/element.js\";\nimport S3Input from \"@components/input/s3/element.js\";\n\n// Add components to DOM\nconst s3 = new S3Input();\nconst input = new InputConfigurator();\ninput.setAttribute(\"group\", GROUP);\ninput.append(s3);\n\nconst output = new OutputOrchestrator();\noutput.setAttribute(\"group\", GROUP);\n\nconst metadataProcessor = new MetadataProcessor();\nmetadataProcessor.setAttribute(\"group\", GROUP);\n\ndocument.body.append(input, output, metadataProcessor);\n\nconst pto = new ProcessTracksOrchestrator();\npto.setAttribute(\"group\", GROUP);\npto.setAttribute(\"input-selector\", input.selector);\npto.setAttribute(\"output-selector\", output.selector);\npto.setAttribute(\"metadata-processor-selector\", metadataProcessor.selector);\n\ndocument.body.append(pto);\n\n// Demo\nconst addDemoBtn = document.querySelector(\"#add-sample-content\");\n\nasync function addSampleContent() {\n if (!addDemoBtn) return;\n\n addDemoBtn.setAttribute(\"disabled\", \"\");\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-hourglass-medium\"></i>\n Adding source\n </span>`;\n\n const demo = await s3.demo();\n const tracks = output.tracks.collection();\n\n await output.tracks.save([...tracks, demo.track]);\n\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-hourglass-medium\"></i>\n Processing source\n </span>`;\n\n await pto.process();\n\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-check-fat\"></i> Added\n </span>`;\n}\n\naddDemoBtn?.addEventListener(\"click\", addSampleContent);\n\n// Version upgrade (only works with `diffuse-artifacts` deployments)\nif (document.location.hostname.endsWith(\"diffuse.sh\")) {\n document.querySelectorAll(\"#status\").forEach(async (status) => {\n const versionOrCid =\n document.location.pathname.slice(1).split(\"/\")[0]?.toLowerCase() ?? \"\";\n const usesCid = versionOrCid.startsWith(\"bafy\");\n const { default: artifacts } = await import(\n `${document.location.origin}/artifacts.json`,\n { with: { type: \"json\" } }\n );\n\n // Latest is located at the end\n const lastArtifact = Object.values(artifacts).reverse()[0];\n\n // Check if using latest\n const isLatest = usesCid\n ? versionOrCid === lastArtifact.cid\n : versionOrCid === lastArtifact.version;\n\n // Remove loading animation\n status.querySelectorAll(\".ph-spinner\").forEach((icon) => {\n icon.parentElement?.classList.add(\"hidden\");\n\n setTimeout(() => {\n icon.parentElement?.classList.remove(\"animate-spin\");\n icon.classList.remove(\"ph-spinner\");\n icon.classList.add(\"ph-arrow-fat-lines-up\");\n }, 500);\n });\n\n // If using CID, append `/hash/` to href\n status.querySelectorAll(`[href=\"/latest/\"]`).forEach((a) => {\n if (usesCid) a.setAttribute(\"href\", \"/latest/hash/\");\n if (!isLatest) {\n setTimeout(() => {\n a.classList.remove(\"hidden\");\n }, 750);\n }\n });\n });\n} else {\n document.querySelectorAll(\"#status\").forEach((status) => {\n status.remove();\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AASA,IAAM,KAAK,IAAIA,iBAAQ;AACvB,IAAM,QAAQ,IAAI,gBAAkB;AACpC,MAAM,aAAa,SAAS,KAAK;AACjC,MAAM,OAAO,EAAE;AAEf,IAAM,SAAS,IAAIA,iBAAmB;AACtC,OAAO,aAAa,SAAS,KAAK;AAElC,IAAM,oBAAoB,IAAIA,iBAAkB;AAChD,kBAAkB,aAAa,SAAS,KAAK;AAE7C,SAAS,KAAK,OAAO,OAAO,QAAQ,iBAAiB;AAErD,IAAM,MAAM,IAAIA,iBAA0B;AAC1C,IAAI,aAAa,SAAS,KAAK;AAC/B,IAAI,aAAa,kBAAkB,MAAM,QAAQ;AACjD,IAAI,aAAa,mBAAmB,OAAO,QAAQ;AACnD,IAAI,aAAa,+BAA+B,kBAAkB,QAAQ;AAE1E,SAAS,KAAK,OAAO,GAAG;AAGxB,IAAM,aAAa,SAAS,cAAc,qBAAqB;AAE/D,eAAe,mBAAmB;AAChC,MAAI,CAAC,WAAY;AAEjB,aAAW,aAAa,YAAY,EAAE;AACtC,aAAW,YAAY;AAAA;AAAA;AAAA;AAKvB,QAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,QAAM,SAAS,OAAO,OAAO,WAAW;AAExC,QAAM,OAAO,OAAO,KAAK,CAAC,GAAG,QAAQ,KAAK,KAAK,CAAC;AAEhD,aAAW,YAAY;AAAA;AAAA;AAAA;AAKvB,QAAM,IAAI,QAAQ;AAElB,aAAW,YAAY;AAAA;AAAA;AAGzB;AAxBe;AA0Bf,YAAY,iBAAiB,SAAS,gBAAgB;AAGtD,IAAI,SAAS,SAAS,SAAS,SAAS,YAAY,GAAG;AACrD,WAAS,iBAAiB,SAAS,EAAE,QAAQ,OAAO,WAAW;AAC7D,UAAM,eACJ,SAAS,SAAS,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY,KAAK;AACtE,UAAM,UAAU,aAAa,WAAW,MAAM;AAC9C,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM,OACnC,GAAG,SAAS,SAAS,MAAM,mBAC3B,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE;AAI3B,UAAM,eAAe,OAAO,OAAO,SAAS,EAAE,QAAQ,EAAE,CAAC;AAGzD,UAAM,WAAW,UACb,iBAAiB,aAAa,MAC9B,iBAAiB,aAAa;AAGlC,WAAO,iBAAiB,aAAa,EAAE,QAAQ,CAAC,SAAS;AACvD,WAAK,eAAe,UAAU,IAAI,QAAQ;AAE1C,iBAAW,MAAM;AACf,aAAK,eAAe,UAAU,OAAO,cAAc;AACnD,aAAK,UAAU,OAAO,YAAY;AAClC,aAAK,UAAU,IAAI,uBAAuB;AAAA,MAC5C,GAAG,GAAG;AAAA,IACR,CAAC;AAGD,WAAO,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,MAAM;AAC1D,UAAI,QAAS,GAAE,aAAa,QAAQ,eAAe;AACnD,UAAI,CAAC,UAAU;AACb,mBAAW,MAAM;AACf,YAAE,UAAU,OAAO,QAAQ;AAAA,QAC7B,GAAG,GAAG;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,OAAO;AACL,WAAS,iBAAiB,SAAS,EAAE,QAAQ,CAAC,WAAW;AACvD,WAAO,OAAO;AAAA,EAChB,CAAC;AACH;","names":["element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/index.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/mstile-150x150.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/mstile-150x150.png
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/node_crypto-QYMDOTAM.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/node_crypto-QYMDOTAM.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/oauth-client-metadata.json
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/oauth-client-metadata.json
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/safari-pinned-tab.svg
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/safari-pinned-tab.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/animations.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/animations.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/base.css
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/base.css.map
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/diffuse/colors.css
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/diffuse/colors.css.map
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/diffuse/fonts.css
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/diffuse/fonts.css.map
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/diffuse/page.css
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/styles/diffuse/page.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/diffuse/page.css.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/styles/diffuse/page.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/font-faces.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/font-faces.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/reset.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/reset.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/variables.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/variables.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/98.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/98.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/ms_sans_serif.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/ms_sans_serif_bold.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/bold/Phosphor-Bold.svg
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/bold/Phosphor-Bold.woff
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/bold/style.css
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/bold/style.css.map
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/fill/Phosphor-Fill.svg
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.svg
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/fill/Phosphor-Fill.woff
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/fill/style.css
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/vendor/phosphor/fill/style.css.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css.map
+166
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css
··· 1 + body { 2 + background-color: var(--bg-color); 3 + color: var(--text-color); 4 + } 5 + 6 + .panel { 7 + border: 2px solid var(--form-color); 8 + border-radius: var(--radius-md); 9 + display: flex; 10 + flex-direction: column; 11 + gap: var(--space-sm); 12 + padding: var(--space-sm); 13 + } 14 + 15 + /** 16 + * Buttons 17 + */ 18 + 19 + button, 20 + .button { 21 + background: transparent; 22 + border: 2px solid var(--form-color); 23 + border-radius: var(--radius-md); 24 + color: currentColor; 25 + cursor: pointer; 26 + display: inline-block; 27 + font-size: var(--fs-xs); 28 + font-family: inherit; 29 + font-weight: 500; 30 + letter-spacing: var(--leading-relaxed); 31 + line-height: 1; 32 + padding: var(--space-xs) var(--space-sm); 33 + text-transform: uppercase; 34 + 35 + & * { 36 + pointer-events: none; 37 + } 38 + 39 + &[disabled] { 40 + cursor: not-allowed; 41 + opacity: 0.4; 42 + } 43 + 44 + &.button--accent { 45 + border-color: var(--accent); 46 + color: var(--accent); 47 + } 48 + 49 + &.button--active { 50 + background-color: var(--accent); 51 + border-color: var(--accent); 52 + color: var(--bg-color); 53 + } 54 + 55 + & > .with-icon { 56 + padding-top: 1px; 57 + } 58 + } 59 + 60 + a.button { 61 + text-decoration: none; 62 + } 63 + 64 + .button-row { 65 + display: inline-flex; 66 + gap: var(--space-2xs); 67 + } 68 + 69 + /** 70 + * Forms 71 + */ 72 + 73 + input, 74 + textarea { 75 + background: transparent; 76 + border: 2px solid var(--form-color); 77 + border-radius: var(--radius-md); 78 + color: inherit; 79 + font-size: var(--fs-sm); 80 + padding: var(--space-2xs); 81 + transition-duration: 250ms; 82 + transition-property: border-color; 83 + width: 100%; 84 + 85 + &:focus { 86 + border-color: var(--accent); 87 + outline: none; 88 + } 89 + } 90 + 91 + textarea { 92 + height: var(--container-xs); 93 + padding: var(--space-xs); 94 + resize: none; 95 + } 96 + 97 + select { 98 + appearance: none; 99 + background: transparent; 100 + border: 2px solid var(--form-color); 101 + border-radius: var(--radius-md); 102 + color: inherit; 103 + font-family: inherit; 104 + font-size: var(--fs-sm); 105 + padding: var(--space-2xs) var(--space-xs); 106 + transition-duration: 250ms; 107 + transition-property: border-color; 108 + 109 + &:focus { 110 + border-color: var(--accent); 111 + outline: none; 112 + } 113 + 114 + option, 115 + optgroup { 116 + color: initial; 117 + } 118 + } 119 + 120 + /** 121 + * Misc 122 + */ 123 + 124 + .with-icon { 125 + align-items: center; 126 + display: inline-flex; 127 + gap: var(--space-2xs); 128 + } 129 + 130 + /** 131 + * Separators 132 + */ 133 + 134 + hr, 135 + .separator { 136 + border: 0; 137 + border-top: 2px solid var(--form-color); 138 + } 139 + 140 + .row { 141 + display: flex; 142 + flex-wrap: wrap; 143 + gap: var(--space-xs); 144 + } 145 + 146 + /** 147 + * Tables 148 + */ 149 + 150 + table { 151 + border-collapse: collapse; 152 + width: 100%; 153 + } 154 + 155 + th, 156 + td { 157 + border: 2px solid var(--form-color); 158 + padding: var(--space-2xs) var(--space-xs); 159 + text-align: left; 160 + } 161 + 162 + th { 163 + font-weight: 600; 164 + } 165 + 166 + /*# sourceMappingURL=./ui.css.map */
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css.map
··· 1 + {"version":3,"sources":["/src/styles/wireframe/ui.css"],"names":[],"mappings":"AAAA;EACE,iCAAiC;EACjC,wBAAwB;AAC1B;;AAEA;EACE,mCAAmC;EACnC,+BAA+B;EAC/B,aAAa;EACb,sBAAsB;EACtB,oBAAoB;EACpB,wBAAwB;AAC1B;;AAEA;;EAEE;;AAEF;;EAEE,uBAAuB;EACvB,mCAAmC;EACnC,+BAA+B;EAC/B,mBAAmB;EACnB,eAAe;EACf,qBAAqB;EACrB,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,sCAAsC;EACtC,cAAc;EACd,wCAAwC;EACxC,yBAAyB;;EAEzB;IACE,oBAAoB;EACtB;;EAEA;IACE,mBAAmB;IACnB,YAAY;EACd;;EAEA;IACE,2BAA2B;IAC3B,oBAAoB;EACtB;;EAEA;IACE,+BAA+B;IAC/B,2BAA2B;IAC3B,sBAAsB;EACxB;;EAEA;IACE,gBAAgB;EAClB;AACF;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,oBAAoB;EACpB,qBAAqB;AACvB;;AAEA;;EAEE;;AAEF;;EAEE,uBAAuB;EACvB,mCAAmC;EACnC,+BAA+B;EAC/B,cAAc;EACd,uBAAuB;EACvB,yBAAyB;EACzB,0BAA0B;EAC1B,iCAAiC;EACjC,WAAW;;EAEX;IACE,2BAA2B;IAC3B,aAAa;EACf;AACF;;AAEA;EACE,2BAA2B;EAC3B,wBAAwB;EACxB,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,uBAAuB;EACvB,mCAAmC;EACnC,+BAA+B;EAC/B,cAAc;EACd,oBAAoB;EACpB,uBAAuB;EACvB,yCAAyC;EACzC,0BAA0B;EAC1B,iCAAiC;;EAEjC;IACE,2BAA2B;IAC3B,aAAa;EACf;;EAEA;;IAEE,cAAc;EAChB;AACF;;AAEA;;EAEE;;AAEF;EACE,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;AACvB;;AAEA;;EAEE;;AAEF;;EAEE,SAAS;EACT,uCAAuC;AACzC;;AAEA;EACE,aAAa;EACb,eAAe;EACf,oBAAoB;AACtB;;AAEA;;EAEE;;AAEF;EACE,yBAAyB;EACzB,WAAW;AACb;;AAEA;;EAEE,mCAAmC;EACnC,yCAAyC;EACzC,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;AAClB","file":"/styles/wireframe/ui.css.map","sourcesContent":["body {\n background-color: var(--bg-color);\n color: var(--text-color);\n}\n\n.panel {\n border: 2px solid var(--form-color);\n border-radius: var(--radius-md);\n display: flex;\n flex-direction: column;\n gap: var(--space-sm);\n padding: var(--space-sm);\n}\n\n/**\n * Buttons\n */\n\nbutton,\n.button {\n background: transparent;\n border: 2px solid var(--form-color);\n border-radius: var(--radius-md);\n color: currentColor;\n cursor: pointer;\n display: inline-block;\n font-size: var(--fs-xs);\n font-family: inherit;\n font-weight: 500;\n letter-spacing: var(--leading-relaxed);\n line-height: 1;\n padding: var(--space-xs) var(--space-sm);\n text-transform: uppercase;\n\n & * {\n pointer-events: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n opacity: 0.4;\n }\n\n &.button--accent {\n border-color: var(--accent);\n color: var(--accent);\n }\n\n &.button--active {\n background-color: var(--accent);\n border-color: var(--accent);\n color: var(--bg-color);\n }\n\n & > .with-icon {\n padding-top: 1px;\n }\n}\n\na.button {\n text-decoration: none;\n}\n\n.button-row {\n display: inline-flex;\n gap: var(--space-2xs);\n}\n\n/**\n * Forms\n */\n\ninput,\ntextarea {\n background: transparent;\n border: 2px solid var(--form-color);\n border-radius: var(--radius-md);\n color: inherit;\n font-size: var(--fs-sm);\n padding: var(--space-2xs);\n transition-duration: 250ms;\n transition-property: border-color;\n width: 100%;\n\n &:focus {\n border-color: var(--accent);\n outline: none;\n }\n}\n\ntextarea {\n height: var(--container-xs);\n padding: var(--space-xs);\n resize: none;\n}\n\nselect {\n appearance: none;\n background: transparent;\n border: 2px solid var(--form-color);\n border-radius: var(--radius-md);\n color: inherit;\n font-family: inherit;\n font-size: var(--fs-sm);\n padding: var(--space-2xs) var(--space-xs);\n transition-duration: 250ms;\n transition-property: border-color;\n\n &:focus {\n border-color: var(--accent);\n outline: none;\n }\n\n option,\n optgroup {\n color: initial;\n }\n}\n\n/**\n * Misc\n */\n\n.with-icon {\n align-items: center;\n display: inline-flex;\n gap: var(--space-2xs);\n}\n\n/**\n * Separators\n */\n\nhr,\n.separator {\n border: 0;\n border-top: 2px solid var(--form-color);\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-xs);\n}\n\n/**\n * Tables\n */\n\ntable {\n border-collapse: collapse;\n width: 100%;\n}\n\nth,\ntd {\n border: 2px solid var(--form-color);\n padding: var(--space-2xs) var(--space-xs);\n text-align: left;\n}\n\nth {\n font-weight: 600;\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/testing/index.html
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/index.html
+28
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/testing/output.js
··· 1 + import { 2 + element_default 3 + } from "../chunk-H4FCSW7J.js"; 4 + import "../chunk-H46AZIKM.js"; 5 + import "../chunk-G56PUJUJ.js"; 6 + import { 7 + effect 8 + } from "../chunk-IZOBPV2S.js"; 9 + import "../chunk-EJ2QF5QE.js"; 10 + import "../chunk-NCFHYTLD.js"; 11 + import { 12 + init_Buffer, 13 + init_process 14 + } from "../chunk-FZQXS3RE.js"; 15 + 16 + // testing/output.js 17 + init_Buffer(); 18 + init_process(); 19 + var output = new element_default(); 20 + document.body.append(output); 21 + effect(() => { 22 + console.log(output.tracks.state()); 23 + }); 24 + effect(() => { 25 + console.log(output.tracks.collection()); 26 + }); 27 + 28 + //# sourceMappingURL=./output.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/testing/output.js.map
··· 1 + ../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/testing/output.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/testing/output/index.html
··· 1 + ../../../bafybeic6tj6wx4iomrjs54m3je4e7lmq4jgcn7zqegufxtvqijffq32zkm/testing/output/index.html
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/testing/sample/tracks.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/testing/sample/tracks.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/artwork-controller/element.css
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/artwork-controller/element.css.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css.map
+1112
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/artwork-controller/element.js
··· 1 + import { 2 + M, 3 + d, 4 + e, 5 + i, 6 + j, 7 + l, 8 + p, 9 + v 10 + } from "../../../chunk-NT5H3ES3.js"; 11 + import { 12 + A, 13 + B, 14 + DEFAULT_GROUP, 15 + DiffuseElement, 16 + query, 17 + whenElementsDefined 18 + } from "../../../chunk-H46AZIKM.js"; 19 + import "../../../chunk-G56PUJUJ.js"; 20 + import { 21 + computed, 22 + signal, 23 + untracked 24 + } from "../../../chunk-IZOBPV2S.js"; 25 + import "../../../chunk-EJ2QF5QE.js"; 26 + import "../../../chunk-NCFHYTLD.js"; 27 + import { 28 + trackArtworkCacheId, 29 + xxh32r 30 + } from "../../../chunk-DUCTMCPX.js"; 31 + import "../../../chunk-UGE3FKYA.js"; 32 + import { 33 + qi 34 + } from "../../../chunk-PUHBIZRM.js"; 35 + import { 36 + __name, 37 + init_Buffer, 38 + init_process 39 + } from "../../../chunk-FZQXS3RE.js"; 40 + 41 + // themes/blur/artwork-controller/element.js 42 + init_Buffer(); 43 + init_process(); 44 + 45 + // ../node_modules/.deno/fast-average-color@9.5.0/node_modules/fast-average-color/dist/index.esm.js 46 + init_Buffer(); 47 + init_process(); 48 + function toHex(num) { 49 + var str = num.toString(16); 50 + return str.length === 1 ? "0" + str : str; 51 + } 52 + __name(toHex, "toHex"); 53 + function arrayToHex(arr) { 54 + return "#" + arr.map(toHex).join(""); 55 + } 56 + __name(arrayToHex, "arrayToHex"); 57 + function isDark(color) { 58 + var result = (color[0] * 299 + color[1] * 587 + color[2] * 114) / 1e3; 59 + return result < 128; 60 + } 61 + __name(isDark, "isDark"); 62 + function prepareIgnoredColor(color) { 63 + if (!color) { 64 + return []; 65 + } 66 + return isRGBArray(color) ? color : [color]; 67 + } 68 + __name(prepareIgnoredColor, "prepareIgnoredColor"); 69 + function isRGBArray(value) { 70 + return Array.isArray(value[0]); 71 + } 72 + __name(isRGBArray, "isRGBArray"); 73 + function isIgnoredColor(data, index, ignoredColor) { 74 + for (var i2 = 0; i2 < ignoredColor.length; i2++) { 75 + if (isIgnoredColorAsNumbers(data, index, ignoredColor[i2])) { 76 + return true; 77 + } 78 + } 79 + return false; 80 + } 81 + __name(isIgnoredColor, "isIgnoredColor"); 82 + function isIgnoredColorAsNumbers(data, index, ignoredColor) { 83 + switch (ignoredColor.length) { 84 + case 3: 85 + if (isIgnoredRGBColor(data, index, ignoredColor)) { 86 + return true; 87 + } 88 + break; 89 + case 4: 90 + if (isIgnoredRGBAColor(data, index, ignoredColor)) { 91 + return true; 92 + } 93 + break; 94 + case 5: 95 + if (isIgnoredRGBAColorWithThreshold(data, index, ignoredColor)) { 96 + return true; 97 + } 98 + break; 99 + default: 100 + return false; 101 + } 102 + } 103 + __name(isIgnoredColorAsNumbers, "isIgnoredColorAsNumbers"); 104 + function isIgnoredRGBColor(data, index, ignoredColor) { 105 + if (data[index + 3] !== 255) { 106 + return true; 107 + } 108 + if (data[index] === ignoredColor[0] && data[index + 1] === ignoredColor[1] && data[index + 2] === ignoredColor[2]) { 109 + return true; 110 + } 111 + return false; 112 + } 113 + __name(isIgnoredRGBColor, "isIgnoredRGBColor"); 114 + function isIgnoredRGBAColor(data, index, ignoredColor) { 115 + if (data[index + 3] && ignoredColor[3]) { 116 + return data[index] === ignoredColor[0] && data[index + 1] === ignoredColor[1] && data[index + 2] === ignoredColor[2] && data[index + 3] === ignoredColor[3]; 117 + } 118 + return data[index + 3] === ignoredColor[3]; 119 + } 120 + __name(isIgnoredRGBAColor, "isIgnoredRGBAColor"); 121 + function inRange(colorComponent, ignoredColorComponent, value) { 122 + return colorComponent >= ignoredColorComponent - value && colorComponent <= ignoredColorComponent + value; 123 + } 124 + __name(inRange, "inRange"); 125 + function isIgnoredRGBAColorWithThreshold(data, index, ignoredColor) { 126 + var redIgnored = ignoredColor[0]; 127 + var greenIgnored = ignoredColor[1]; 128 + var blueIgnored = ignoredColor[2]; 129 + var alphaIgnored = ignoredColor[3]; 130 + var threshold = ignoredColor[4]; 131 + var alphaData = data[index + 3]; 132 + var alphaInRange = inRange(alphaData, alphaIgnored, threshold); 133 + if (!alphaIgnored) { 134 + return alphaInRange; 135 + } 136 + if (!alphaData && alphaInRange) { 137 + return true; 138 + } 139 + if (inRange(data[index], redIgnored, threshold) && inRange(data[index + 1], greenIgnored, threshold) && inRange(data[index + 2], blueIgnored, threshold) && alphaInRange) { 140 + return true; 141 + } 142 + return false; 143 + } 144 + __name(isIgnoredRGBAColorWithThreshold, "isIgnoredRGBAColorWithThreshold"); 145 + var DEFAULT_DOMINANT_DIVIDER = 24; 146 + function dominantAlgorithm(arr, len, options) { 147 + var colorHash = {}; 148 + var divider = options.dominantDivider || DEFAULT_DOMINANT_DIVIDER; 149 + var ignoredColor = options.ignoredColor; 150 + var step = options.step; 151 + var max = [0, 0, 0, 0, 0]; 152 + for (var i2 = 0; i2 < len; i2 += step) { 153 + var red = arr[i2]; 154 + var green = arr[i2 + 1]; 155 + var blue = arr[i2 + 2]; 156 + var alpha = arr[i2 + 3]; 157 + if (ignoredColor && isIgnoredColor(arr, i2, ignoredColor)) { 158 + continue; 159 + } 160 + var key = Math.round(red / divider) + "," + Math.round(green / divider) + "," + Math.round(blue / divider); 161 + if (colorHash[key]) { 162 + colorHash[key] = [ 163 + colorHash[key][0] + red * alpha, 164 + colorHash[key][1] + green * alpha, 165 + colorHash[key][2] + blue * alpha, 166 + colorHash[key][3] + alpha, 167 + colorHash[key][4] + 1 168 + ]; 169 + } else { 170 + colorHash[key] = [red * alpha, green * alpha, blue * alpha, alpha, 1]; 171 + } 172 + if (max[4] < colorHash[key][4]) { 173 + max = colorHash[key]; 174 + } 175 + } 176 + var redTotal = max[0]; 177 + var greenTotal = max[1]; 178 + var blueTotal = max[2]; 179 + var alphaTotal = max[3]; 180 + var count = max[4]; 181 + return alphaTotal ? [ 182 + Math.round(redTotal / alphaTotal), 183 + Math.round(greenTotal / alphaTotal), 184 + Math.round(blueTotal / alphaTotal), 185 + Math.round(alphaTotal / count) 186 + ] : options.defaultColor; 187 + } 188 + __name(dominantAlgorithm, "dominantAlgorithm"); 189 + function simpleAlgorithm(arr, len, options) { 190 + var redTotal = 0; 191 + var greenTotal = 0; 192 + var blueTotal = 0; 193 + var alphaTotal = 0; 194 + var count = 0; 195 + var ignoredColor = options.ignoredColor; 196 + var step = options.step; 197 + for (var i2 = 0; i2 < len; i2 += step) { 198 + var alpha = arr[i2 + 3]; 199 + var red = arr[i2] * alpha; 200 + var green = arr[i2 + 1] * alpha; 201 + var blue = arr[i2 + 2] * alpha; 202 + if (ignoredColor && isIgnoredColor(arr, i2, ignoredColor)) { 203 + continue; 204 + } 205 + redTotal += red; 206 + greenTotal += green; 207 + blueTotal += blue; 208 + alphaTotal += alpha; 209 + count++; 210 + } 211 + return alphaTotal ? [ 212 + Math.round(redTotal / alphaTotal), 213 + Math.round(greenTotal / alphaTotal), 214 + Math.round(blueTotal / alphaTotal), 215 + Math.round(alphaTotal / count) 216 + ] : options.defaultColor; 217 + } 218 + __name(simpleAlgorithm, "simpleAlgorithm"); 219 + function sqrtAlgorithm(arr, len, options) { 220 + var redTotal = 0; 221 + var greenTotal = 0; 222 + var blueTotal = 0; 223 + var alphaTotal = 0; 224 + var count = 0; 225 + var ignoredColor = options.ignoredColor; 226 + var step = options.step; 227 + for (var i2 = 0; i2 < len; i2 += step) { 228 + var red = arr[i2]; 229 + var green = arr[i2 + 1]; 230 + var blue = arr[i2 + 2]; 231 + var alpha = arr[i2 + 3]; 232 + if (ignoredColor && isIgnoredColor(arr, i2, ignoredColor)) { 233 + continue; 234 + } 235 + redTotal += red * red * alpha; 236 + greenTotal += green * green * alpha; 237 + blueTotal += blue * blue * alpha; 238 + alphaTotal += alpha; 239 + count++; 240 + } 241 + return alphaTotal ? [ 242 + Math.round(Math.sqrt(redTotal / alphaTotal)), 243 + Math.round(Math.sqrt(greenTotal / alphaTotal)), 244 + Math.round(Math.sqrt(blueTotal / alphaTotal)), 245 + Math.round(alphaTotal / count) 246 + ] : options.defaultColor; 247 + } 248 + __name(sqrtAlgorithm, "sqrtAlgorithm"); 249 + function getDefaultColor(options) { 250 + return getOption(options, "defaultColor", [0, 0, 0, 0]); 251 + } 252 + __name(getDefaultColor, "getDefaultColor"); 253 + function getOption(options, name, defaultValue) { 254 + return options[name] === void 0 ? defaultValue : options[name]; 255 + } 256 + __name(getOption, "getOption"); 257 + var MIN_SIZE = 10; 258 + var MAX_SIZE = 100; 259 + function isSvg(filename) { 260 + return filename.search(/\.svg(\?|$)/i) !== -1; 261 + } 262 + __name(isSvg, "isSvg"); 263 + function getOriginalSize(resource) { 264 + if (isInstanceOfHTMLImageElement(resource)) { 265 + var width = resource.naturalWidth; 266 + var height = resource.naturalHeight; 267 + if (!resource.naturalWidth && isSvg(resource.src)) { 268 + width = height = MAX_SIZE; 269 + } 270 + return { 271 + width, 272 + height 273 + }; 274 + } 275 + if (isInstanceOfHTMLVideoElement(resource)) { 276 + return { 277 + width: resource.videoWidth, 278 + height: resource.videoHeight 279 + }; 280 + } 281 + if (isInstanceOfVideoFrame(resource)) { 282 + return { 283 + width: resource.codedWidth, 284 + height: resource.codedHeight 285 + }; 286 + } 287 + return { 288 + width: resource.width, 289 + height: resource.height 290 + }; 291 + } 292 + __name(getOriginalSize, "getOriginalSize"); 293 + function getSrc(resource) { 294 + if (isInstanceOfHTMLCanvasElement(resource)) { 295 + return "canvas"; 296 + } 297 + if (isInstanceOfOffscreenCanvas(resource)) { 298 + return "offscreencanvas"; 299 + } 300 + if (isInstanceOfVideoFrame(resource)) { 301 + return "videoframe"; 302 + } 303 + if (isInstanceOfImageBitmap(resource)) { 304 + return "imagebitmap"; 305 + } 306 + return resource.src; 307 + } 308 + __name(getSrc, "getSrc"); 309 + function isInstanceOfHTMLImageElement(resource) { 310 + return typeof HTMLImageElement !== "undefined" && resource instanceof HTMLImageElement; 311 + } 312 + __name(isInstanceOfHTMLImageElement, "isInstanceOfHTMLImageElement"); 313 + var hasOffscreenCanvas = typeof OffscreenCanvas !== "undefined"; 314 + function isInstanceOfOffscreenCanvas(resource) { 315 + return hasOffscreenCanvas && resource instanceof OffscreenCanvas; 316 + } 317 + __name(isInstanceOfOffscreenCanvas, "isInstanceOfOffscreenCanvas"); 318 + function isInstanceOfHTMLVideoElement(resource) { 319 + return typeof HTMLVideoElement !== "undefined" && resource instanceof HTMLVideoElement; 320 + } 321 + __name(isInstanceOfHTMLVideoElement, "isInstanceOfHTMLVideoElement"); 322 + function isInstanceOfVideoFrame(resource) { 323 + return typeof VideoFrame !== "undefined" && resource instanceof VideoFrame; 324 + } 325 + __name(isInstanceOfVideoFrame, "isInstanceOfVideoFrame"); 326 + function isInstanceOfHTMLCanvasElement(resource) { 327 + return typeof HTMLCanvasElement !== "undefined" && resource instanceof HTMLCanvasElement; 328 + } 329 + __name(isInstanceOfHTMLCanvasElement, "isInstanceOfHTMLCanvasElement"); 330 + function isInstanceOfImageBitmap(resource) { 331 + return typeof ImageBitmap !== "undefined" && resource instanceof ImageBitmap; 332 + } 333 + __name(isInstanceOfImageBitmap, "isInstanceOfImageBitmap"); 334 + function prepareSizeAndPosition(originalSize, options) { 335 + var srcLeft = getOption(options, "left", 0); 336 + var srcTop = getOption(options, "top", 0); 337 + var srcWidth = getOption(options, "width", originalSize.width); 338 + var srcHeight = getOption(options, "height", originalSize.height); 339 + var destWidth = srcWidth; 340 + var destHeight = srcHeight; 341 + if (options.mode === "precision") { 342 + return { 343 + srcLeft, 344 + srcTop, 345 + srcWidth, 346 + srcHeight, 347 + destWidth, 348 + destHeight 349 + }; 350 + } 351 + var factor; 352 + if (srcWidth > srcHeight) { 353 + factor = srcWidth / srcHeight; 354 + destWidth = MAX_SIZE; 355 + destHeight = Math.round(destWidth / factor); 356 + } else { 357 + factor = srcHeight / srcWidth; 358 + destHeight = MAX_SIZE; 359 + destWidth = Math.round(destHeight / factor); 360 + } 361 + if (destWidth > srcWidth || destHeight > srcHeight || destWidth < MIN_SIZE || destHeight < MIN_SIZE) { 362 + destWidth = srcWidth; 363 + destHeight = srcHeight; 364 + } 365 + return { 366 + srcLeft, 367 + srcTop, 368 + srcWidth, 369 + srcHeight, 370 + destWidth, 371 + destHeight 372 + }; 373 + } 374 + __name(prepareSizeAndPosition, "prepareSizeAndPosition"); 375 + var isWebWorkers = typeof window === "undefined"; 376 + function makeCanvas() { 377 + if (isWebWorkers) { 378 + return hasOffscreenCanvas ? new OffscreenCanvas(1, 1) : null; 379 + } 380 + return document.createElement("canvas"); 381 + } 382 + __name(makeCanvas, "makeCanvas"); 383 + var ERROR_PREFIX = "FastAverageColor: "; 384 + function getError(message) { 385 + return Error(ERROR_PREFIX + message); 386 + } 387 + __name(getError, "getError"); 388 + function outputError(error, silent) { 389 + if (!silent) { 390 + console.error(error); 391 + } 392 + } 393 + __name(outputError, "outputError"); 394 + var FastAverageColor = ( 395 + /** @class */ 396 + (function() { 397 + function FastAverageColor2() { 398 + this.canvas = null; 399 + this.ctx = null; 400 + } 401 + __name(FastAverageColor2, "FastAverageColor"); 402 + FastAverageColor2.prototype.getColorAsync = function(resource, options) { 403 + if (!resource) { 404 + return Promise.reject(getError("call .getColorAsync() without resource")); 405 + } 406 + if (typeof resource === "string") { 407 + if (typeof Image === "undefined") { 408 + return Promise.reject(getError("resource as string is not supported in this environment")); 409 + } 410 + var img = new Image(); 411 + img.crossOrigin = options && options.crossOrigin || ""; 412 + img.src = resource; 413 + return this.bindImageEvents(img, options); 414 + } else if (isInstanceOfHTMLImageElement(resource) && !resource.complete) { 415 + return this.bindImageEvents(resource, options); 416 + } else { 417 + var result = this.getColor(resource, options); 418 + return result.error ? Promise.reject(result.error) : Promise.resolve(result); 419 + } 420 + }; 421 + FastAverageColor2.prototype.getColor = function(resource, options) { 422 + options = options || {}; 423 + var defaultColor = getDefaultColor(options); 424 + if (!resource) { 425 + var error = getError("call .getColor() without resource"); 426 + outputError(error, options.silent); 427 + return this.prepareResult(defaultColor, error); 428 + } 429 + var originalSize = getOriginalSize(resource); 430 + var size = prepareSizeAndPosition(originalSize, options); 431 + if (!size.srcWidth || !size.srcHeight || !size.destWidth || !size.destHeight) { 432 + var error = getError('incorrect sizes for resource "'.concat(getSrc(resource), '"')); 433 + outputError(error, options.silent); 434 + return this.prepareResult(defaultColor, error); 435 + } 436 + if (!this.canvas) { 437 + this.canvas = makeCanvas(); 438 + if (!this.canvas) { 439 + var error = getError("OffscreenCanvas is not supported in this browser"); 440 + outputError(error, options.silent); 441 + return this.prepareResult(defaultColor, error); 442 + } 443 + } 444 + if (!this.ctx) { 445 + this.ctx = this.canvas.getContext("2d", { willReadFrequently: true }); 446 + if (!this.ctx) { 447 + var error = getError("Canvas Context 2D is not supported in this browser"); 448 + outputError(error, options.silent); 449 + return this.prepareResult(defaultColor); 450 + } 451 + this.ctx.imageSmoothingEnabled = false; 452 + } 453 + this.canvas.width = size.destWidth; 454 + this.canvas.height = size.destHeight; 455 + try { 456 + this.ctx.clearRect(0, 0, size.destWidth, size.destHeight); 457 + this.ctx.drawImage(resource, size.srcLeft, size.srcTop, size.srcWidth, size.srcHeight, 0, 0, size.destWidth, size.destHeight); 458 + var bitmapData = this.ctx.getImageData(0, 0, size.destWidth, size.destHeight).data; 459 + return this.prepareResult(this.getColorFromArray4(bitmapData, options)); 460 + } catch (originalError) { 461 + var error = getError("security error (CORS) for resource ".concat(getSrc(resource), ".\nDetails: https://developer.mozilla.org/en/docs/Web/HTML/CORS_enabled_image")); 462 + outputError(error, options.silent); 463 + if (!options.silent) { 464 + console.error(originalError); 465 + } 466 + return this.prepareResult(defaultColor, error); 467 + } 468 + }; 469 + FastAverageColor2.prototype.getColorFromArray4 = function(arr, options) { 470 + options = options || {}; 471 + var bytesPerPixel = 4; 472 + var arrLength = arr.length; 473 + var defaultColor = getDefaultColor(options); 474 + if (arrLength < bytesPerPixel) { 475 + return defaultColor; 476 + } 477 + var len = arrLength - arrLength % bytesPerPixel; 478 + var step = (options.step || 1) * bytesPerPixel; 479 + var algorithm; 480 + switch (options.algorithm || "sqrt") { 481 + case "simple": 482 + algorithm = simpleAlgorithm; 483 + break; 484 + case "sqrt": 485 + algorithm = sqrtAlgorithm; 486 + break; 487 + case "dominant": 488 + algorithm = dominantAlgorithm; 489 + break; 490 + default: 491 + throw getError("".concat(options.algorithm, " is unknown algorithm")); 492 + } 493 + return algorithm(arr, len, { 494 + defaultColor, 495 + ignoredColor: prepareIgnoredColor(options.ignoredColor), 496 + step, 497 + dominantDivider: options.dominantDivider 498 + }); 499 + }; 500 + FastAverageColor2.prototype.prepareResult = function(value, error) { 501 + var rgb = value.slice(0, 3); 502 + var rgba = [value[0], value[1], value[2], value[3] / 255]; 503 + var isDarkColor = isDark(value); 504 + return { 505 + value: [value[0], value[1], value[2], value[3]], 506 + rgb: "rgb(" + rgb.join(",") + ")", 507 + rgba: "rgba(" + rgba.join(",") + ")", 508 + hex: arrayToHex(rgb), 509 + hexa: arrayToHex(value), 510 + isDark: isDarkColor, 511 + isLight: !isDarkColor, 512 + error 513 + }; 514 + }; 515 + FastAverageColor2.prototype.destroy = function() { 516 + if (this.canvas) { 517 + this.canvas.width = 1; 518 + this.canvas.height = 1; 519 + this.canvas = null; 520 + } 521 + this.ctx = null; 522 + }; 523 + FastAverageColor2.prototype.bindImageEvents = function(resource, options) { 524 + var _this = this; 525 + return new Promise(function(resolve, reject) { 526 + var onload = /* @__PURE__ */ __name(function() { 527 + unbindEvents(); 528 + var result = _this.getColor(resource, options); 529 + if (result.error) { 530 + reject(result.error); 531 + } else { 532 + resolve(result); 533 + } 534 + }, "onload"); 535 + var onerror = /* @__PURE__ */ __name(function() { 536 + unbindEvents(); 537 + reject(getError('Error loading image "'.concat(resource.src, '"'))); 538 + }, "onerror"); 539 + var onabort = /* @__PURE__ */ __name(function() { 540 + unbindEvents(); 541 + reject(getError('Image "'.concat(resource.src, '" loading aborted'))); 542 + }, "onabort"); 543 + var unbindEvents = /* @__PURE__ */ __name(function() { 544 + resource.removeEventListener("load", onload); 545 + resource.removeEventListener("error", onerror); 546 + resource.removeEventListener("abort", onabort); 547 + }, "unbindEvents"); 548 + resource.addEventListener("load", onload); 549 + resource.addEventListener("error", onerror); 550 + resource.addEventListener("abort", onabort); 551 + }); 552 + }; 553 + return FastAverageColor2; 554 + })() 555 + ); 556 + 557 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/directives/cache.js 558 + init_Buffer(); 559 + init_process(); 560 + var d2 = /* @__PURE__ */ __name((t) => d(t) ? t._$litType$.h : t.strings, "d"); 561 + var h = e(class extends i { 562 + constructor(t) { 563 + super(t), this.et = /* @__PURE__ */ new WeakMap(); 564 + } 565 + render(t) { 566 + return [t]; 567 + } 568 + update(s, [e2]) { 569 + const u = l(this.it) ? d2(this.it) : null, h2 = l(e2) ? d2(e2) : null; 570 + if (null !== u && (null === h2 || u !== h2)) { 571 + const e3 = M(s).pop(); 572 + let o = this.et.get(u); 573 + if (void 0 === o) { 574 + const s2 = document.createDocumentFragment(); 575 + o = B(A, s2), o.setConnected(false), this.et.set(u, o); 576 + } 577 + p(o, [e3]), v(o, void 0, e3); 578 + } 579 + if (null !== h2) { 580 + if (null === u || u !== h2) { 581 + const t = this.et.get(h2); 582 + if (void 0 !== t) { 583 + const i2 = M(t).pop(); 584 + j(s), v(s, void 0, i2), p(s, [i2]); 585 + } 586 + } 587 + this.it = e2; 588 + } else this.it = void 0; 589 + return this.render(e2); 590 + } 591 + }); 592 + 593 + // ../node_modules/.deno/throttle-debounce@5.0.2/node_modules/throttle-debounce/esm/index.js 594 + init_Buffer(); 595 + init_process(); 596 + function throttle(delay, callback, options) { 597 + var _ref = options || {}, _ref$noTrailing = _ref.noTrailing, noTrailing = _ref$noTrailing === void 0 ? false : _ref$noTrailing, _ref$noLeading = _ref.noLeading, noLeading = _ref$noLeading === void 0 ? false : _ref$noLeading, _ref$debounceMode = _ref.debounceMode, debounceMode = _ref$debounceMode === void 0 ? void 0 : _ref$debounceMode; 598 + var timeoutID; 599 + var cancelled = false; 600 + var lastExec = 0; 601 + function clearExistingTimeout() { 602 + if (timeoutID) { 603 + clearTimeout(timeoutID); 604 + } 605 + } 606 + __name(clearExistingTimeout, "clearExistingTimeout"); 607 + function cancel(options2) { 608 + var _ref2 = options2 || {}, _ref2$upcomingOnly = _ref2.upcomingOnly, upcomingOnly = _ref2$upcomingOnly === void 0 ? false : _ref2$upcomingOnly; 609 + clearExistingTimeout(); 610 + cancelled = !upcomingOnly; 611 + } 612 + __name(cancel, "cancel"); 613 + function wrapper() { 614 + for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) { 615 + arguments_[_key] = arguments[_key]; 616 + } 617 + var self = this; 618 + var elapsed = Date.now() - lastExec; 619 + if (cancelled) { 620 + return; 621 + } 622 + function exec() { 623 + lastExec = Date.now(); 624 + callback.apply(self, arguments_); 625 + } 626 + __name(exec, "exec"); 627 + function clear() { 628 + timeoutID = void 0; 629 + } 630 + __name(clear, "clear"); 631 + if (!noLeading && debounceMode && !timeoutID) { 632 + exec(); 633 + } 634 + clearExistingTimeout(); 635 + if (debounceMode === void 0 && elapsed > delay) { 636 + if (noLeading) { 637 + lastExec = Date.now(); 638 + if (!noTrailing) { 639 + timeoutID = setTimeout(debounceMode ? clear : exec, delay); 640 + } 641 + } else { 642 + exec(); 643 + } 644 + } else if (noTrailing !== true) { 645 + timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === void 0 ? delay - elapsed : delay); 646 + } 647 + } 648 + __name(wrapper, "wrapper"); 649 + wrapper.cancel = cancel; 650 + return wrapper; 651 + } 652 + __name(throttle, "throttle"); 653 + function debounce(delay, callback, options) { 654 + var _ref = options || {}, _ref$atBegin = _ref.atBegin, atBegin = _ref$atBegin === void 0 ? false : _ref$atBegin; 655 + return throttle(delay, callback, { 656 + debounceMode: atBegin !== false 657 + }); 658 + } 659 + __name(debounce, "debounce"); 660 + 661 + // themes/blur/artwork-controller/element.js 662 + var ArtworkController = class extends DiffuseElement { 663 + static { 664 + __name(this, "ArtworkController"); 665 + } 666 + constructor() { 667 + super(); 668 + this.attachShadow({ mode: "open" }); 669 + } 670 + // VARIABLES 671 + /** @type {number | undefined} */ 672 + #isLoadingTimeout = void 0; 673 + // SIGNALS 674 + #artwork = signal( 675 + /** @type {{ current: (Artwork & { hash: string; index: number; loaded: boolean; url: string }) | null; previous: (Artwork & { hash: string; index: number; loaded: boolean; url: string }) | null }} */ 676 + { 677 + current: null, 678 + previous: null 679 + }, 680 + { eager: true } 681 + ); 682 + #artworkColor = signal( 683 + /** @type {string | undefined} */ 684 + void 0 685 + ); 686 + #artworkLightMode = signal(false); 687 + #duration = signal("0:00"); 688 + #isLoading = signal(true); 689 + #time = signal("0:00"); 690 + // SIGNALS - DEPENDENCIES 691 + $artwork = signal( 692 + /** @type {ArtworkProcessor | undefined} */ 693 + void 0 694 + ); 695 + $audio = signal( 696 + /** @type {AudioEngine | undefined} */ 697 + void 0 698 + ); 699 + $favourites = signal( 700 + /** @type {FavouritesOrchestrator | undefined} */ 701 + void 0 702 + ); 703 + $input = signal( 704 + /** @type {InputElement | undefined} */ 705 + void 0 706 + ); 707 + $queue = signal( 708 + /** @type {QueueEngine | undefined} */ 709 + void 0 710 + ); 711 + // SIGNALS - COMPUTED 712 + #audio = computed(() => { 713 + const curr = this.$queue.value?.now(); 714 + return curr ? this.$audio.value?.state(curr.id) : void 0; 715 + }); 716 + #isPlaying = computed(() => { 717 + return this.$audio.value?.isPlaying(); 718 + }); 719 + // LIFECYCLE 720 + /** 721 + * @override 722 + */ 723 + connectedCallback() { 724 + super.connectedCallback(); 725 + const artwork = query(this, "artwork-processor-selector"); 726 + const audio = query(this, "audio-engine-selector"); 727 + const input = query(this, "input-selector"); 728 + const queue = query(this, "queue-engine-selector"); 729 + const favourites = query(this, "favourites-orchestrator-selector"); 730 + whenElementsDefined({ audio, artwork, favourites, input, queue }).then( 731 + () => { 732 + this.$artwork.value = artwork; 733 + this.$audio.value = audio; 734 + this.$input.value = input; 735 + this.$queue.value = queue; 736 + this.$favourites.value = favourites; 737 + const debouncedChangeArtwork = debounce( 738 + 1e3, 739 + this.#setArtwork.bind(this) 740 + ); 741 + this.effect(() => { 742 + const _trigger = queue.now(); 743 + debouncedChangeArtwork(); 744 + }); 745 + this.effect(() => this.#formatTimestamps()); 746 + this.effect(() => this.#lightOrDark()); 747 + this.effect(() => { 748 + const now = !!queue.now(); 749 + const aud = this.#audio()?.loadingState(); 750 + const bool = now && aud !== "loaded"; 751 + if (this.#isLoadingTimeout) { 752 + clearTimeout(this.#isLoadingTimeout); 753 + } 754 + if (bool) { 755 + this.#isLoadingTimeout = setTimeout( 756 + () => this.#isLoading.value = true, 757 + 2e3 758 + ); 759 + } else { 760 + this.#isLoading.value = false; 761 + } 762 + }); 763 + } 764 + ); 765 + } 766 + //////////////////////////////////////////// 767 + // ✨ EFFECTS 768 + // 🖼️ Artwork 769 + //////////////////////////////////////////// 770 + #lightOrDark() { 771 + const controller = this.root().querySelector(".controller__inner"); 772 + if (!controller) return; 773 + if (this.#artworkLightMode.value) { 774 + controller.classList.add("controller__inner--light-mode"); 775 + } else controller.classList.remove("controller__inner--light-mode"); 776 + } 777 + /** */ 778 + async #setArtwork() { 779 + const track = this.$queue.value?.now(); 780 + const currArtwork = untracked(this.#artwork.get); 781 + if (!track) { 782 + if (currArtwork.current) { 783 + this.#artwork.value = { current: null, previous: currArtwork.current }; 784 + } 785 + return; 786 + } 787 + const cacheId = await trackArtworkCacheId(track); 788 + const resGet = await this.$input.value?.resolve({ 789 + method: "GET", 790 + uri: track.uri 791 + }); 792 + const resHead = await this.$input.value?.resolve({ 793 + method: "HEAD", 794 + uri: track.uri 795 + }); 796 + if (!resGet) return; 797 + const request = "stream" in resGet ? { 798 + cacheId, 799 + stream: resGet.stream, 800 + tags: track.tags 801 + } : { 802 + cacheId, 803 + tags: track.tags, 804 + urls: { 805 + get: resGet.url, 806 + head: resHead && "url" in resHead ? resHead.url : resGet.url 807 + } 808 + }; 809 + if (this.$queue.value?.now()?.id !== track.id) { 810 + return; 811 + } 812 + const allArt = await this.$artwork.value?.artwork(request) ?? []; 813 + const currTrack = this.$queue.value?.now(); 814 + const currCacheId = currTrack ? await trackArtworkCacheId(currTrack) : void 0; 815 + if (cacheId === currCacheId) { 816 + const art = allArt[0]; 817 + this.#artwork.set({ 818 + previous: currArtwork.current ? { ...currArtwork.current, loaded: false } : null, 819 + current: art ? { 820 + ...art, 821 + hash: xxh32r(art.bytes).toString(), 822 + index: (currArtwork.current?.index ?? 0) + 1, 823 + loaded: false, 824 + url: URL.createObjectURL( 825 + new Blob( 826 + [ 827 + /** @type {ArrayBuffer} */ 828 + art.bytes.buffer 829 + ], 830 + { type: art.mime } 831 + ) 832 + ) 833 + } : null 834 + }); 835 + if (!art) { 836 + this.#artworkColor.value = void 0; 837 + this.#artworkLightMode.value = false; 838 + } 839 + } 840 + } 841 + //////////////////////////////////////////// 842 + // ✨ EFFECTS 843 + // ⌚️ Time 844 + //////////////////////////////////////////// 845 + #formatTimestamps() { 846 + const curr = this.$queue.value?.now?.() ?? void 0; 847 + const audio = this.#audio(); 848 + const prog = audio?.progress() ?? 0; 849 + const durMs = curr?.stats?.duration ?? (audio?.duration() != null ? audio.duration() * 1e3 : void 0); 850 + if (audio && durMs != void 0 && !isNaN(durMs)) { 851 + const p2 = qi.Duration.from({ 852 + milliseconds: Math.round(durMs * prog) 853 + }).round({ 854 + largestUnit: "hours", 855 + smallestUnit: "seconds" 856 + }); 857 + const d3 = qi.Duration.from({ milliseconds: Math.round(durMs) }).round({ 858 + largestUnit: "hours", 859 + smallestUnit: "seconds" 860 + }); 861 + this.#time.value = this.#formatTime(p2); 862 + this.#duration.value = this.#formatTime(d3); 863 + } else { 864 + this.#time.value = "0:00"; 865 + this.#duration.value = "0:00"; 866 + } 867 + } 868 + /** 869 + * @param {Temporal.Duration} duration 870 + */ 871 + #formatTime(duration) { 872 + return `${duration.hours > 0 ? duration.hours.toFixed(0) + ":" : ""}${duration.hours > 0 ? duration.minutes > 9 ? duration.minutes.toFixed(0) : "0" + duration.minutes.toFixed(0) : duration.minutes.toFixed(0)}:${duration.seconds > 9 ? duration.seconds.toFixed(0) : "0" + duration.seconds.toFixed(0)}`; 873 + } 874 + // EVENTS 875 + /** 876 + * @param {Event} event 877 + */ 878 + artworkLoaded = /* @__PURE__ */ __name((event) => { 879 + if (!(event.target instanceof HTMLImageElement)) return; 880 + const hash = event.target.getAttribute("data-hash"); 881 + if (!hash) return; 882 + if (hash !== this.#artwork.value.current?.hash) return; 883 + if (this.#artwork.value.current?.loaded) return; 884 + const fac = new FastAverageColor(); 885 + const color = fac.getColor(event.target); 886 + const rgb = color.value; 887 + const o = Math.round( 888 + (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1e3 889 + ); 890 + this.#artworkColor.value = color.rgba; 891 + this.#artworkLightMode.value = o > 165; 892 + this.#artwork.value = { 893 + previous: this.#artwork.value.previous, 894 + current: { ...this.#artwork.value.current, loaded: true } 895 + }; 896 + }, "artworkLoaded"); 897 + fullVolume = /* @__PURE__ */ __name(() => { 898 + this.$audio.value?.adjustVolume({ volume: 1 }); 899 + }, "fullVolume"); 900 + mute = /* @__PURE__ */ __name(() => { 901 + this.$audio.value?.adjustVolume({ volume: 0 }); 902 + }, "mute"); 903 + next = /* @__PURE__ */ __name(() => { 904 + this.$queue.value?.shift(); 905 + }, "next"); 906 + playPause = /* @__PURE__ */ __name(() => { 907 + const audioId = this.$queue.value?.now()?.id; 908 + if (this.#isPlaying() && audioId) { 909 + this.$audio.value?.pause({ audioId }); 910 + } else if (audioId) { 911 + this.$audio.value?.play({ audioId }); 912 + } 913 + }, "playPause"); 914 + previous = /* @__PURE__ */ __name(() => { 915 + this.$queue.value?.unshift(); 916 + }, "previous"); 917 + /** 918 + * @param {MouseEvent} event 919 + */ 920 + seek = /* @__PURE__ */ __name((event) => { 921 + const target = event.target ? ( 922 + /** @type {HTMLProgressElement} */ 923 + event.target 924 + ) : null; 925 + const percentage = target ? event.offsetX / target.clientWidth : 0; 926 + const audioId = this.$queue.value?.now()?.id; 927 + if (audioId) this.$audio.value?.seek({ audioId, percentage }); 928 + }, "seek"); 929 + /** 930 + * @param {MouseEvent} event 931 + */ 932 + setVolume = /* @__PURE__ */ __name((event) => { 933 + const target = event.target ? ( 934 + /** @type {HTMLProgressElement} */ 935 + event.target 936 + ) : null; 937 + const percentage = target ? event.offsetX / target.clientWidth : 0; 938 + this.$audio.value?.adjustVolume({ volume: percentage }); 939 + }, "setVolume"); 940 + toggleFavourite = /* @__PURE__ */ __name(() => { 941 + const activeQueueItem = this.$queue.value?.now(); 942 + if (!activeQueueItem) return; 943 + this.$favourites.value?.toggle(activeQueueItem); 944 + }, "toggleFavourite"); 945 + // RENDER 946 + /** 947 + * @param {RenderArg} _ 948 + */ 949 + render({ html }) { 950 + const activeQueueItem = this.$queue.value?.now(); 951 + const isFav = activeQueueItem ? this.$favourites.value?.isFavourite(activeQueueItem) ?? false : false; 952 + const artworkArr = [ 953 + this.#artwork.value.previous, 954 + this.#artwork.value.current 955 + ].sort((a, b) => { 956 + if (!a || !b) return 0; 957 + return a.index % 2 ? 1 : -1; 958 + }); 959 + const artwork = artworkArr.map((art) => { 960 + if (art === null) { 961 + return null; 962 + } 963 + return h(html` 964 + <img 965 + @load="${this.artworkLoaded}" 966 + data-hash="${art.hash}" 967 + src="${art.url}" 968 + style="opacity: ${art.loaded ? `1` : `0`}" 969 + /> 970 + `); 971 + }); 972 + return html` 973 + <link rel="stylesheet" href="styles/vendor/phosphor/bold/style.css" /> 974 + <link rel="stylesheet" href="styles/vendor/phosphor/fill/style.css" /> 975 + <link rel="stylesheet" href="styles/animations.css" /> 976 + <link rel="stylesheet" href="themes/blur/artwork-controller/element.css" /> 977 + 978 + <main style="background-color: ${this.#artworkColor.value ?? `revert-layer`};"> 979 + <section class="artwork"> 980 + <label style="display: ${this.group === DEFAULT_GROUP ? `none` : `block`};"> 981 + ${this.group} 982 + </label> 983 + 984 + ${artwork} 985 + </section> 986 + 987 + <section class="controller" style="opacity: 0;"> 988 + <div class="gradient-blur"> 989 + <div></div> 990 + <div></div> 991 + <div></div> 992 + <div></div> 993 + <div></div> 994 + <div></div> 995 + <div></div> 996 + <div></div> 997 + </div> 998 + 999 + <div 1000 + class="controller__background" 1001 + style="background-color: ${this.#artworkColor.value ?? `revert-layer`};" 1002 + > 1003 + </div> 1004 + 1005 + <section class="controller__inner"> 1006 + <!-- NOW PLAYING --> 1007 + 1008 + <cite> 1009 + <strong>${activeQueueItem?.tags?.title || "Diffuse"}</strong> 1010 + <span style="font-style: ${activeQueueItem ? `normal` : `italic`}"> 1011 + ${activeQueueItem?.tags?.artist ?? (activeQueueItem ? `Waiting on queue ...` : ``)} 1012 + </span> 1013 + </cite> 1014 + 1015 + <!-- PROGRESS --> 1016 + 1017 + <div class="progress" @click="${this.seek}"> 1018 + <progress max="100" value="${(this.#audio()?.progress() ?? 0) * 100}"></progress> 1019 + <div class="timestamps"> 1020 + <time datetime="${this.#time.value}">${this.#time.value}</time> 1021 + <time datetime="${this.#time.value}">${this.#duration.value}</time> 1022 + </div> 1023 + </div> 1024 + 1025 + <!-- CONTROLS --> 1026 + 1027 + <menu> 1028 + <!-- previous --> 1029 + <li @click="${this.previous}"> 1030 + <i class="ph-fill ph-rewind" title="Previous track"></i> 1031 + </li> 1032 + 1033 + <!-- loading ... --> 1034 + <div 1035 + class="animate-bounce menu__loader" 1036 + style="display: ${this.#isLoading.value ? `inherit` : `none`};" 1037 + > 1038 + <i class="ph-fill ph-vinyl-record" title="Loading ..."></i> 1039 + </div> 1040 + 1041 + <!-- play --> 1042 + <li 1043 + @click="${this.playPause}" 1044 + style="display: ${!this.#isLoading.value && !this.#isPlaying() ? `inline` : `none`};" 1045 + > 1046 + <i class="ph-fill ph-play" title="Play"></i> 1047 + </li> 1048 + 1049 + <!-- pause --> 1050 + <li 1051 + @click="${this.playPause}" 1052 + style="display: ${!this.#isLoading.value && this.#isPlaying() ? `inline` : `none`};" 1053 + > 1054 + <i class="ph-fill ph-pause" title="Pause"></i> 1055 + </li> 1056 + 1057 + <!-- next --> 1058 + <li @click="${this.next}"> 1059 + <i class="ph-fill ph-fast-forward" title="Next track"></i> 1060 + </li> 1061 + </menu> 1062 + 1063 + <!-- VOLUME --> 1064 + 1065 + <div class="volume"> 1066 + <i @click="${this.mute}" class="ph-fill ph-speaker-none"></i> 1067 + <div @click="${this.setVolume}" class="progress-bar"> 1068 + <progress max="100" value="${(this.$audio.value?.volume() ?? 0) * 100}"></progress> 1069 + </div> 1070 + <i @click="${this.fullVolume}" class="ph-fill ph-speaker-high"></i> 1071 + </div> 1072 + 1073 + <footer> 1074 + <div class="button-row"> 1075 + <button 1076 + title="Toggle favourite" 1077 + data-enabled="${isFav ? `t` : `f`}" 1078 + @click="${this.toggleFavourite}" 1079 + > 1080 + <i class="ph-${isFav ? `fill` : `bold`} ph-star"></i> 1081 + </button> 1082 + </div> 1083 + </footer> 1084 + </section> 1085 + </section> 1086 + </main> 1087 + `; 1088 + } 1089 + }; 1090 + var element_default = ArtworkController; 1091 + var CLASS = ArtworkController; 1092 + var NAME = "db-artwork-controller"; 1093 + customElements.define(NAME, CLASS); 1094 + export { 1095 + CLASS, 1096 + NAME, 1097 + element_default as default 1098 + }; 1099 + /*! Bundled license information: 1100 + 1101 + fast-average-color/dist/index.esm.js: 1102 + (*! Fast Average Color | © 2025 Denis Seleznev | MIT License | https://github.com/fast-average-color/fast-average-color *) 1103 + 1104 + lit-html/node/directives/cache.js: 1105 + (** 1106 + * @license 1107 + * Copyright 2017 Google LLC 1108 + * SPDX-License-Identifier: BSD-3-Clause 1109 + *) 1110 + */ 1111 + 1112 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/artwork-controller/element.js.map
··· 1 + {"version":3,"sources":["/element.js","/node_modules/.deno/fast-average-color@9.5.0/node_modules/fast-average-color/dist/index.esm.js","/node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/src/directives/cache.ts","/node_modules/.deno/throttle-debounce@5.0.2/node_modules/throttle-debounce/throttle.js","/node_modules/.deno/throttle-debounce@5.0.2/node_modules/throttle-debounce/debounce.js"],"sourcesContent":["import { FastAverageColor } from \"fast-average-color\";\nimport { Temporal } from \"@js-temporal/polyfill\";\nimport { cache } from \"lit-html/directives/cache.js\";\nimport { debounce } from \"throttle-debounce\";\nimport { xxh32r } from \"xxh32/dist/raw.js\";\n\nimport {\n DEFAULT_GROUP,\n DiffuseElement,\n query,\n whenElementsDefined,\n} from \"@common/element.js\";\n\nimport { trackArtworkCacheId } from \"@common/utils.js\";\nimport { computed, signal, untracked } from \"@common/signal.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n *\n * @import {InputElement} from \"@components/input/types.d.ts\"\n * @import {Artwork} from \"@components/processor/artwork/types.d.ts\"\n * @import AudioEngine from \"@components/engine/audio/element.js\"\n * @import QueueEngine from \"@components/engine/queue/element.js\"\n * @import ArtworkProcessor from \"@components/processor/artwork/element.js\"\n * @import FavouritesOrchestrator from \"@components/orchestrator/favourites/element.js\"\n */\n\nclass ArtworkController extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n // VARIABLES\n\n /** @type {number | undefined} */\n #isLoadingTimeout = undefined;\n\n // SIGNALS\n\n #artwork = signal(\n /** @type {{ current: (Artwork & { hash: string; index: number; loaded: boolean; url: string }) | null; previous: (Artwork & { hash: string; index: number; loaded: boolean; url: string }) | null }} */ ({\n current: null,\n previous: null,\n }),\n { eager: true },\n );\n\n #artworkColor = signal(/** @type {string | undefined} */ (undefined));\n #artworkLightMode = signal(false);\n #duration = signal(\"0:00\");\n #isLoading = signal(true);\n #time = signal(\"0:00\");\n\n // SIGNALS - DEPENDENCIES\n\n $artwork = signal(/** @type {ArtworkProcessor | undefined} */ (undefined));\n $audio = signal(/** @type {AudioEngine | undefined} */ (undefined));\n $favourites = signal(\n /** @type {FavouritesOrchestrator | undefined} */ (undefined),\n );\n $input = signal(/** @type {InputElement | undefined} */ (undefined));\n $queue = signal(/** @type {QueueEngine | undefined} */ (undefined));\n\n // SIGNALS - COMPUTED\n\n #audio = computed(() => {\n const curr = this.$queue.value?.now();\n return curr ? this.$audio.value?.state(curr.id) : undefined;\n });\n\n #isPlaying = computed(() => {\n return this.$audio.value?.isPlaying();\n });\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n /** @type {ArtworkProcessor} */\n const artwork = query(this, \"artwork-processor-selector\");\n\n /** @type {AudioEngine} */\n const audio = query(this, \"audio-engine-selector\");\n\n /** @type {InputElement} */\n const input = query(this, \"input-selector\");\n\n /** @type {QueueEngine} */\n const queue = query(this, \"queue-engine-selector\");\n\n /** @type {FavouritesOrchestrator} */\n const favourites = query(this, \"favourites-orchestrator-selector\");\n\n whenElementsDefined({ audio, artwork, favourites, input, queue }).then(\n () => {\n this.$artwork.value = artwork;\n this.$audio.value = audio;\n this.$input.value = input;\n this.$queue.value = queue;\n this.$favourites.value = favourites;\n\n // Changed artwork based on active queue item.\n const debouncedChangeArtwork = debounce(\n 1000,\n this.#setArtwork.bind(this),\n );\n\n this.effect(() => {\n const _trigger = queue.now();\n debouncedChangeArtwork();\n });\n\n this.effect(() => this.#formatTimestamps());\n this.effect(() => this.#lightOrDark());\n\n this.effect(() => {\n const now = !!queue.now();\n const aud = this.#audio()?.loadingState();\n const bool = now && aud !== \"loaded\";\n\n if (this.#isLoadingTimeout) {\n clearTimeout(this.#isLoadingTimeout);\n }\n\n if (bool) {\n this.#isLoadingTimeout = setTimeout(\n () => this.#isLoading.value = true,\n 2000,\n );\n } else {\n this.#isLoading.value = false;\n }\n });\n },\n );\n }\n\n ////////////////////////////////////////////\n // ✨ EFFECTS\n // 🖼️ Artwork\n ////////////////////////////////////////////\n\n #lightOrDark() {\n const controller = this.root().querySelector(\".controller__inner\");\n if (!controller) return;\n\n if (this.#artworkLightMode.value) {\n controller.classList.add(\"controller__inner--light-mode\");\n } else controller.classList.remove(\"controller__inner--light-mode\");\n }\n\n /** */\n async #setArtwork() {\n const track = this.$queue.value?.now();\n const currArtwork = untracked(this.#artwork.get);\n\n if (!track) {\n if (currArtwork.current) {\n this.#artwork.value = { current: null, previous: currArtwork.current };\n }\n return;\n }\n\n const cacheId = await trackArtworkCacheId(track);\n\n const resGet = await this.$input.value?.resolve({\n method: \"GET\",\n uri: track.uri,\n });\n\n const resHead = await this.$input.value?.resolve({\n method: \"HEAD\",\n uri: track.uri,\n });\n\n if (!resGet) return;\n\n const request = \"stream\" in resGet\n ? {\n cacheId,\n stream: resGet.stream,\n tags: track.tags,\n }\n : {\n cacheId,\n tags: track.tags,\n urls: {\n get: resGet.url,\n head: resHead && \"url\" in resHead ? resHead.url : resGet.url,\n },\n };\n\n if (this.$queue.value?.now()?.id !== track.id) {\n return;\n }\n\n const allArt = await this.$artwork.value?.artwork(request) ?? [];\n\n const currTrack = this.$queue.value?.now();\n const currCacheId = currTrack\n ? await trackArtworkCacheId(currTrack)\n : undefined;\n\n if (cacheId === currCacheId) {\n const art = allArt[0];\n\n this.#artwork.set({\n previous: currArtwork.current\n ? { ...currArtwork.current, loaded: false }\n : null,\n current: art\n ? {\n ...art,\n hash: xxh32r(art.bytes).toString(),\n index: (currArtwork.current?.index ?? 0) + 1,\n loaded: false,\n url: URL.createObjectURL(\n new Blob(\n [/** @type {ArrayBuffer} */ (art.bytes.buffer)],\n { type: art.mime },\n ),\n ),\n }\n : null,\n });\n\n if (!art) {\n this.#artworkColor.value = undefined;\n this.#artworkLightMode.value = false;\n }\n }\n }\n\n ////////////////////////////////////////////\n // ✨ EFFECTS\n // ⌚️ Time\n ////////////////////////////////////////////\n #formatTimestamps() {\n const curr = this.$queue.value?.now?.() ?? undefined;\n const audio = this.#audio();\n const prog = audio?.progress() ?? 0;\n const durMs = curr?.stats?.duration ??\n (audio?.duration() != null ? audio.duration() * 1000 : undefined);\n\n if (audio && durMs != undefined && !isNaN(durMs)) {\n const p = Temporal.Duration.from({\n milliseconds: Math.round(durMs * prog),\n }).round({\n largestUnit: \"hours\",\n smallestUnit: \"seconds\",\n });\n\n const d = Temporal.Duration.from({ milliseconds: Math.round(durMs) })\n .round({\n largestUnit: \"hours\",\n smallestUnit: \"seconds\",\n });\n\n this.#time.value = this.#formatTime(p);\n this.#duration.value = this.#formatTime(d);\n } else {\n this.#time.value = \"0:00\";\n this.#duration.value = \"0:00\";\n }\n }\n\n /**\n * @param {Temporal.Duration} duration\n */\n #formatTime(duration) {\n return `${duration.hours > 0 ? duration.hours.toFixed(0) + \":\" : \"\"}${\n duration.hours > 0\n ? (duration.minutes > 9\n ? duration.minutes.toFixed(0)\n : \"0\" + duration.minutes.toFixed(0))\n : duration.minutes.toFixed(0)\n }:${\n duration.seconds > 9\n ? duration.seconds.toFixed(0)\n : \"0\" + duration.seconds.toFixed(0)\n }`;\n }\n\n // EVENTS\n\n /**\n * @param {Event} event\n */\n artworkLoaded = (event) => {\n if (!(event.target instanceof HTMLImageElement)) return;\n\n const hash = event.target.getAttribute(\"data-hash\");\n if (!hash) return;\n\n if (hash !== this.#artwork.value.current?.hash) return;\n if (this.#artwork.value.current?.loaded) return;\n\n const fac = new FastAverageColor();\n const color = fac.getColor(event.target);\n const rgb = color.value;\n const o = Math.round(\n (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000,\n );\n\n this.#artworkColor.value = color.rgba;\n this.#artworkLightMode.value = o > 165;\n this.#artwork.value = {\n previous: this.#artwork.value.previous,\n current: { ...this.#artwork.value.current, loaded: true },\n };\n };\n\n fullVolume = () => {\n this.$audio.value?.adjustVolume({ volume: 1 });\n };\n\n mute = () => {\n this.$audio.value?.adjustVolume({ volume: 0 });\n };\n\n next = () => {\n this.$queue.value?.shift();\n };\n\n playPause = () => {\n const audioId = this.$queue.value?.now()?.id;\n\n if (this.#isPlaying() && audioId) {\n this.$audio.value?.pause({ audioId });\n } else if (audioId) {\n this.$audio.value?.play({ audioId });\n }\n };\n\n previous = () => {\n this.$queue.value?.unshift();\n };\n\n /**\n * @param {MouseEvent} event\n */\n seek = (event) => {\n const target = event.target\n ? /** @type {HTMLProgressElement} */ (event.target)\n : null;\n const percentage = target ? event.offsetX / target.clientWidth : 0;\n const audioId = this.$queue.value?.now()?.id;\n\n if (audioId) this.$audio.value?.seek({ audioId, percentage });\n };\n\n /**\n * @param {MouseEvent} event\n */\n setVolume = (event) => {\n const target = event.target\n ? /** @type {HTMLProgressElement} */ (event.target)\n : null;\n\n const percentage = target ? event.offsetX / target.clientWidth : 0;\n this.$audio.value?.adjustVolume({ volume: percentage });\n };\n\n toggleFavourite = () => {\n const activeQueueItem = this.$queue.value?.now();\n if (!activeQueueItem) return;\n\n this.$favourites.value?.toggle(activeQueueItem);\n };\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n const activeQueueItem = this.$queue.value?.now();\n const isFav = activeQueueItem\n ? this.$favourites.value?.isFavourite(activeQueueItem) ?? false\n : false;\n\n // Artwork\n const artworkArr = [\n this.#artwork.value.previous,\n this.#artwork.value.current,\n ].sort((a, b) => {\n if (!a || !b) return 0;\n return a.index % 2 ? 1 : -1;\n });\n\n const artwork = artworkArr.map((art) => {\n if (art === null) {\n return null;\n }\n\n return cache(html`\n <img\n @load=\"${this.artworkLoaded}\"\n data-hash=\"${art.hash}\"\n src=\"${art.url}\"\n style=\"opacity: ${art.loaded ? `1` : `0`}\"\n />\n `);\n });\n\n return html`\n <link rel=\"stylesheet\" href=\"styles/vendor/phosphor/bold/style.css\" />\n <link rel=\"stylesheet\" href=\"styles/vendor/phosphor/fill/style.css\" />\n <link rel=\"stylesheet\" href=\"styles/animations.css\" />\n <link rel=\"stylesheet\" href=\"themes/blur/artwork-controller/element.css\" />\n\n <main style=\"background-color: ${this.#artworkColor.value ??\n `revert-layer`};\">\n <section class=\"artwork\">\n <label style=\"display: ${this.group === DEFAULT_GROUP\n ? `none`\n : `block`};\">\n ${this.group}\n </label>\n\n ${artwork}\n </section>\n\n <section class=\"controller\" style=\"opacity: 0;\">\n <div class=\"gradient-blur\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n\n <div\n class=\"controller__background\"\n style=\"background-color: ${this.#artworkColor.value ??\n `revert-layer`};\"\n >\n </div>\n\n <section class=\"controller__inner\">\n <!-- NOW PLAYING -->\n\n <cite>\n <strong>${activeQueueItem?.tags?.title ||\n \"Diffuse\"}</strong>\n <span style=\"font-style: ${activeQueueItem\n ? `normal`\n : `italic`}\">\n ${activeQueueItem?.tags?.artist ??\n (activeQueueItem ? `Waiting on queue ...` : ``)}\n </span>\n </cite>\n\n <!-- PROGRESS -->\n\n <div class=\"progress\" @click=\"${this.seek}\">\n <progress max=\"100\" value=\"${(this.#audio()?.progress() ??\n 0) * 100}\"></progress>\n <div class=\"timestamps\">\n <time datetime=\"${this.#time.value}\">${this.#time.value}</time>\n <time datetime=\"${this.#time.value}\">${this.#duration\n .value}</time>\n </div>\n </div>\n\n <!-- CONTROLS -->\n\n <menu>\n <!-- previous -->\n <li @click=\"${this.previous}\">\n <i class=\"ph-fill ph-rewind\" title=\"Previous track\"></i>\n </li>\n\n <!-- loading ... -->\n <div\n class=\"animate-bounce menu__loader\"\n style=\"display: ${this.#isLoading.value ? `inherit` : `none`};\"\n >\n <i class=\"ph-fill ph-vinyl-record\" title=\"Loading ...\"></i>\n </div>\n\n <!-- play -->\n <li\n @click=\"${this.playPause}\"\n style=\"display: ${!this.#isLoading.value &&\n !this.#isPlaying()\n ? `inline`\n : `none`};\"\n >\n <i class=\"ph-fill ph-play\" title=\"Play\"></i>\n </li>\n\n <!-- pause -->\n <li\n @click=\"${this.playPause}\"\n style=\"display: ${!this.#isLoading.value && this.#isPlaying()\n ? `inline`\n : `none`};\"\n >\n <i class=\"ph-fill ph-pause\" title=\"Pause\"></i>\n </li>\n\n <!-- next -->\n <li @click=\"${this.next}\">\n <i class=\"ph-fill ph-fast-forward\" title=\"Next track\"></i>\n </li>\n </menu>\n\n <!-- VOLUME -->\n\n <div class=\"volume\">\n <i @click=\"${this.mute}\" class=\"ph-fill ph-speaker-none\"></i>\n <div @click=\"${this.setVolume}\" class=\"progress-bar\">\n <progress max=\"100\" value=\"${(this.$audio.value?.volume() ??\n 0) * 100}\"></progress>\n </div>\n <i @click=\"${this\n .fullVolume}\" class=\"ph-fill ph-speaker-high\"></i>\n </div>\n\n <footer>\n <div class=\"button-row\">\n <button\n title=\"Toggle favourite\"\n data-enabled=\"${isFav ? `t` : `f`}\"\n @click=\"${this.toggleFavourite}\"\n >\n <i class=\"ph-${isFav ? `fill` : `bold`} ph-star\"></i>\n </button>\n </div>\n </footer>\n </section>\n </section>\n </main>\n `;\n }\n}\n\nexport default ArtworkController;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ArtworkController;\nexport const NAME = \"db-artwork-controller\";\n\ncustomElements.define(NAME, CLASS);\n","/*! Fast Average Color | © 2025 Denis Seleznev | MIT License | https://github.com/fast-average-color/fast-average-color */\nfunction toHex(num) {\n var str = num.toString(16);\n return str.length === 1 ? '0' + str : str;\n}\nfunction arrayToHex(arr) {\n return '#' + arr.map(toHex).join('');\n}\nfunction isDark(color) {\n // http://www.w3.org/TR/AERT#color-contrast\n var result = (color[0] * 299 + color[1] * 587 + color[2] * 114) / 1000;\n return result < 128;\n}\nfunction prepareIgnoredColor(color) {\n if (!color) {\n return [];\n }\n return isRGBArray(color) ? color : [color];\n}\nfunction isRGBArray(value) {\n return Array.isArray(value[0]);\n}\nfunction isIgnoredColor(data, index, ignoredColor) {\n for (var i = 0; i < ignoredColor.length; i++) {\n if (isIgnoredColorAsNumbers(data, index, ignoredColor[i])) {\n return true;\n }\n }\n return false;\n}\nfunction isIgnoredColorAsNumbers(data, index, ignoredColor) {\n switch (ignoredColor.length) {\n case 3:\n // [red, green, blue]\n if (isIgnoredRGBColor(data, index, ignoredColor)) {\n return true;\n }\n break;\n case 4:\n // [red, green, blue, alpha]\n if (isIgnoredRGBAColor(data, index, ignoredColor)) {\n return true;\n }\n break;\n case 5:\n // [red, green, blue, alpha, threshold]\n if (isIgnoredRGBAColorWithThreshold(data, index, ignoredColor)) {\n return true;\n }\n break;\n default:\n return false;\n }\n}\nfunction isIgnoredRGBColor(data, index, ignoredColor) {\n // Ignore if the pixel are transparent.\n if (data[index + 3] !== 255) {\n return true;\n }\n if (data[index] === ignoredColor[0] &&\n data[index + 1] === ignoredColor[1] &&\n data[index + 2] === ignoredColor[2]) {\n return true;\n }\n return false;\n}\nfunction isIgnoredRGBAColor(data, index, ignoredColor) {\n if (data[index + 3] && ignoredColor[3]) {\n return data[index] === ignoredColor[0] &&\n data[index + 1] === ignoredColor[1] &&\n data[index + 2] === ignoredColor[2] &&\n data[index + 3] === ignoredColor[3];\n }\n // Ignore rgb components if the pixel are fully transparent.\n return data[index + 3] === ignoredColor[3];\n}\nfunction inRange(colorComponent, ignoredColorComponent, value) {\n return colorComponent >= (ignoredColorComponent - value) &&\n colorComponent <= (ignoredColorComponent + value);\n}\nfunction isIgnoredRGBAColorWithThreshold(data, index, ignoredColor) {\n var redIgnored = ignoredColor[0];\n var greenIgnored = ignoredColor[1];\n var blueIgnored = ignoredColor[2];\n var alphaIgnored = ignoredColor[3];\n var threshold = ignoredColor[4];\n var alphaData = data[index + 3];\n var alphaInRange = inRange(alphaData, alphaIgnored, threshold);\n if (!alphaIgnored) {\n return alphaInRange;\n }\n if (!alphaData && alphaInRange) {\n return true;\n }\n if (inRange(data[index], redIgnored, threshold) &&\n inRange(data[index + 1], greenIgnored, threshold) &&\n inRange(data[index + 2], blueIgnored, threshold) &&\n alphaInRange) {\n return true;\n }\n return false;\n}\n\nvar DEFAULT_DOMINANT_DIVIDER = 24;\nfunction dominantAlgorithm(arr, len, options) {\n var colorHash = {};\n var divider = options.dominantDivider || DEFAULT_DOMINANT_DIVIDER;\n var ignoredColor = options.ignoredColor;\n var step = options.step;\n var max = [0, 0, 0, 0, 0];\n for (var i = 0; i < len; i += step) {\n var red = arr[i];\n var green = arr[i + 1];\n var blue = arr[i + 2];\n var alpha = arr[i + 3];\n if (ignoredColor && isIgnoredColor(arr, i, ignoredColor)) {\n continue;\n }\n var key = Math.round(red / divider) + ',' +\n Math.round(green / divider) + ',' +\n Math.round(blue / divider);\n if (colorHash[key]) {\n colorHash[key] = [\n colorHash[key][0] + red * alpha,\n colorHash[key][1] + green * alpha,\n colorHash[key][2] + blue * alpha,\n colorHash[key][3] + alpha,\n colorHash[key][4] + 1\n ];\n }\n else {\n colorHash[key] = [red * alpha, green * alpha, blue * alpha, alpha, 1];\n }\n if (max[4] < colorHash[key][4]) {\n max = colorHash[key];\n }\n }\n var redTotal = max[0];\n var greenTotal = max[1];\n var blueTotal = max[2];\n var alphaTotal = max[3];\n var count = max[4];\n return alphaTotal ? [\n Math.round(redTotal / alphaTotal),\n Math.round(greenTotal / alphaTotal),\n Math.round(blueTotal / alphaTotal),\n Math.round(alphaTotal / count)\n ] : options.defaultColor;\n}\n\nfunction simpleAlgorithm(arr, len, options) {\n var redTotal = 0;\n var greenTotal = 0;\n var blueTotal = 0;\n var alphaTotal = 0;\n var count = 0;\n var ignoredColor = options.ignoredColor;\n var step = options.step;\n for (var i = 0; i < len; i += step) {\n var alpha = arr[i + 3];\n var red = arr[i] * alpha;\n var green = arr[i + 1] * alpha;\n var blue = arr[i + 2] * alpha;\n if (ignoredColor && isIgnoredColor(arr, i, ignoredColor)) {\n continue;\n }\n redTotal += red;\n greenTotal += green;\n blueTotal += blue;\n alphaTotal += alpha;\n count++;\n }\n return alphaTotal ? [\n Math.round(redTotal / alphaTotal),\n Math.round(greenTotal / alphaTotal),\n Math.round(blueTotal / alphaTotal),\n Math.round(alphaTotal / count)\n ] : options.defaultColor;\n}\n\nfunction sqrtAlgorithm(arr, len, options) {\n var redTotal = 0;\n var greenTotal = 0;\n var blueTotal = 0;\n var alphaTotal = 0;\n var count = 0;\n var ignoredColor = options.ignoredColor;\n var step = options.step;\n for (var i = 0; i < len; i += step) {\n var red = arr[i];\n var green = arr[i + 1];\n var blue = arr[i + 2];\n var alpha = arr[i + 3];\n if (ignoredColor && isIgnoredColor(arr, i, ignoredColor)) {\n continue;\n }\n redTotal += red * red * alpha;\n greenTotal += green * green * alpha;\n blueTotal += blue * blue * alpha;\n alphaTotal += alpha;\n count++;\n }\n return alphaTotal ? [\n Math.round(Math.sqrt(redTotal / alphaTotal)),\n Math.round(Math.sqrt(greenTotal / alphaTotal)),\n Math.round(Math.sqrt(blueTotal / alphaTotal)),\n Math.round(alphaTotal / count)\n ] : options.defaultColor;\n}\n\nfunction getDefaultColor(options) {\n return getOption(options, 'defaultColor', [0, 0, 0, 0]);\n}\nfunction getOption(options, name, defaultValue) {\n return (options[name] === undefined ? defaultValue : options[name]);\n}\n\nvar MIN_SIZE = 10;\nvar MAX_SIZE = 100;\nfunction isSvg(filename) {\n return filename.search(/\\.svg(\\?|$)/i) !== -1;\n}\nfunction getOriginalSize(resource) {\n if (isInstanceOfHTMLImageElement(resource)) {\n var width = resource.naturalWidth;\n var height = resource.naturalHeight;\n // For SVG images with only viewBox attribute\n if (!resource.naturalWidth && isSvg(resource.src)) {\n width = height = MAX_SIZE;\n }\n return {\n width: width,\n height: height,\n };\n }\n if (isInstanceOfHTMLVideoElement(resource)) {\n return {\n width: resource.videoWidth,\n height: resource.videoHeight\n };\n }\n if (isInstanceOfVideoFrame(resource)) {\n return {\n width: resource.codedWidth,\n height: resource.codedHeight,\n };\n }\n return {\n width: resource.width,\n height: resource.height\n };\n}\nfunction getSrc(resource) {\n if (isInstanceOfHTMLCanvasElement(resource)) {\n return 'canvas';\n }\n if (isInstanceOfOffscreenCanvas(resource)) {\n return 'offscreencanvas';\n }\n if (isInstanceOfVideoFrame(resource)) {\n return 'videoframe';\n }\n if (isInstanceOfImageBitmap(resource)) {\n return 'imagebitmap';\n }\n return resource.src;\n}\nfunction isInstanceOfHTMLImageElement(resource) {\n return typeof HTMLImageElement !== 'undefined' && resource instanceof HTMLImageElement;\n}\nvar hasOffscreenCanvas = typeof OffscreenCanvas !== 'undefined';\nfunction isInstanceOfOffscreenCanvas(resource) {\n return hasOffscreenCanvas && resource instanceof OffscreenCanvas;\n}\nfunction isInstanceOfHTMLVideoElement(resource) {\n return typeof HTMLVideoElement !== 'undefined' && resource instanceof HTMLVideoElement;\n}\nfunction isInstanceOfVideoFrame(resource) {\n return typeof VideoFrame !== 'undefined' && resource instanceof VideoFrame;\n}\nfunction isInstanceOfHTMLCanvasElement(resource) {\n return typeof HTMLCanvasElement !== 'undefined' && resource instanceof HTMLCanvasElement;\n}\nfunction isInstanceOfImageBitmap(resource) {\n return typeof ImageBitmap !== 'undefined' && resource instanceof ImageBitmap;\n}\nfunction prepareSizeAndPosition(originalSize, options) {\n var srcLeft = getOption(options, 'left', 0);\n var srcTop = getOption(options, 'top', 0);\n var srcWidth = getOption(options, 'width', originalSize.width);\n var srcHeight = getOption(options, 'height', originalSize.height);\n var destWidth = srcWidth;\n var destHeight = srcHeight;\n if (options.mode === 'precision') {\n return {\n srcLeft: srcLeft,\n srcTop: srcTop,\n srcWidth: srcWidth,\n srcHeight: srcHeight,\n destWidth: destWidth,\n destHeight: destHeight\n };\n }\n var factor;\n if (srcWidth > srcHeight) {\n factor = srcWidth / srcHeight;\n destWidth = MAX_SIZE;\n destHeight = Math.round(destWidth / factor);\n }\n else {\n factor = srcHeight / srcWidth;\n destHeight = MAX_SIZE;\n destWidth = Math.round(destHeight / factor);\n }\n if (destWidth > srcWidth || destHeight > srcHeight ||\n destWidth < MIN_SIZE || destHeight < MIN_SIZE) {\n destWidth = srcWidth;\n destHeight = srcHeight;\n }\n return {\n srcLeft: srcLeft,\n srcTop: srcTop,\n srcWidth: srcWidth,\n srcHeight: srcHeight,\n destWidth: destWidth,\n destHeight: destHeight\n };\n}\nvar isWebWorkers = typeof window === 'undefined';\nfunction makeCanvas() {\n if (isWebWorkers) {\n return hasOffscreenCanvas ? new OffscreenCanvas(1, 1) : null;\n }\n return document.createElement('canvas');\n}\n\nvar ERROR_PREFIX = 'FastAverageColor: ';\nfunction getError(message) {\n return Error(ERROR_PREFIX + message);\n}\nfunction outputError(error, silent) {\n if (!silent) {\n console.error(error);\n }\n}\n\nvar FastAverageColor = /** @class */ (function () {\n function FastAverageColor() {\n this.canvas = null;\n this.ctx = null;\n }\n FastAverageColor.prototype.getColorAsync = function (resource, options) {\n if (!resource) {\n return Promise.reject(getError('call .getColorAsync() without resource'));\n }\n if (typeof resource === 'string') {\n // Web workers\n if (typeof Image === 'undefined') {\n return Promise.reject(getError('resource as string is not supported in this environment'));\n }\n var img = new Image();\n img.crossOrigin = options && options.crossOrigin || '';\n img.src = resource;\n return this.bindImageEvents(img, options);\n }\n else if (isInstanceOfHTMLImageElement(resource) && !resource.complete) {\n return this.bindImageEvents(resource, options);\n }\n else {\n var result = this.getColor(resource, options);\n return result.error ? Promise.reject(result.error) : Promise.resolve(result);\n }\n };\n /**\n * Get the average color from images, videos and canvas.\n */\n FastAverageColor.prototype.getColor = function (resource, options) {\n options = options || {};\n var defaultColor = getDefaultColor(options);\n if (!resource) {\n var error = getError('call .getColor() without resource');\n outputError(error, options.silent);\n return this.prepareResult(defaultColor, error);\n }\n var originalSize = getOriginalSize(resource);\n var size = prepareSizeAndPosition(originalSize, options);\n if (!size.srcWidth || !size.srcHeight || !size.destWidth || !size.destHeight) {\n var error = getError(\"incorrect sizes for resource \\\"\".concat(getSrc(resource), \"\\\"\"));\n outputError(error, options.silent);\n return this.prepareResult(defaultColor, error);\n }\n if (!this.canvas) {\n this.canvas = makeCanvas();\n if (!this.canvas) {\n var error = getError('OffscreenCanvas is not supported in this browser');\n outputError(error, options.silent);\n return this.prepareResult(defaultColor, error);\n }\n }\n if (!this.ctx) {\n this.ctx = this.canvas.getContext('2d', { willReadFrequently: true });\n if (!this.ctx) {\n var error = getError('Canvas Context 2D is not supported in this browser');\n outputError(error, options.silent);\n return this.prepareResult(defaultColor);\n }\n this.ctx.imageSmoothingEnabled = false;\n }\n this.canvas.width = size.destWidth;\n this.canvas.height = size.destHeight;\n try {\n this.ctx.clearRect(0, 0, size.destWidth, size.destHeight);\n this.ctx.drawImage(resource, size.srcLeft, size.srcTop, size.srcWidth, size.srcHeight, 0, 0, size.destWidth, size.destHeight);\n var bitmapData = this.ctx.getImageData(0, 0, size.destWidth, size.destHeight).data;\n return this.prepareResult(this.getColorFromArray4(bitmapData, options));\n }\n catch (originalError) {\n var error = getError(\"security error (CORS) for resource \".concat(getSrc(resource), \".\\nDetails: https://developer.mozilla.org/en/docs/Web/HTML/CORS_enabled_image\"));\n outputError(error, options.silent);\n if (!options.silent) {\n console.error(originalError);\n }\n return this.prepareResult(defaultColor, error);\n }\n };\n /**\n * Get the average color from a array when 1 pixel is 4 bytes.\n */\n FastAverageColor.prototype.getColorFromArray4 = function (arr, options) {\n options = options || {};\n var bytesPerPixel = 4;\n var arrLength = arr.length;\n var defaultColor = getDefaultColor(options);\n if (arrLength < bytesPerPixel) {\n return defaultColor;\n }\n var len = arrLength - arrLength % bytesPerPixel;\n var step = (options.step || 1) * bytesPerPixel;\n var algorithm;\n switch (options.algorithm || 'sqrt') {\n case 'simple':\n algorithm = simpleAlgorithm;\n break;\n case 'sqrt':\n algorithm = sqrtAlgorithm;\n break;\n case 'dominant':\n algorithm = dominantAlgorithm;\n break;\n default:\n throw getError(\"\".concat(options.algorithm, \" is unknown algorithm\"));\n }\n return algorithm(arr, len, {\n defaultColor: defaultColor,\n ignoredColor: prepareIgnoredColor(options.ignoredColor),\n step: step,\n dominantDivider: options.dominantDivider,\n });\n };\n /**\n * Get color data from value ([r, g, b, a]).\n */\n FastAverageColor.prototype.prepareResult = function (value, error) {\n var rgb = value.slice(0, 3);\n var rgba = [value[0], value[1], value[2], value[3] / 255];\n var isDarkColor = isDark(value);\n return {\n value: [value[0], value[1], value[2], value[3]],\n rgb: 'rgb(' + rgb.join(',') + ')',\n rgba: 'rgba(' + rgba.join(',') + ')',\n hex: arrayToHex(rgb),\n hexa: arrayToHex(value),\n isDark: isDarkColor,\n isLight: !isDarkColor,\n error: error,\n };\n };\n /**\n * Destroy the instance.\n */\n FastAverageColor.prototype.destroy = function () {\n if (this.canvas) {\n this.canvas.width = 1;\n this.canvas.height = 1;\n this.canvas = null;\n }\n this.ctx = null;\n };\n FastAverageColor.prototype.bindImageEvents = function (resource, options) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var onload = function () {\n unbindEvents();\n var result = _this.getColor(resource, options);\n if (result.error) {\n reject(result.error);\n }\n else {\n resolve(result);\n }\n };\n var onerror = function () {\n unbindEvents();\n reject(getError(\"Error loading image \\\"\".concat(resource.src, \"\\\"\")));\n };\n var onabort = function () {\n unbindEvents();\n reject(getError(\"Image \\\"\".concat(resource.src, \"\\\" loading aborted\")));\n };\n var unbindEvents = function () {\n resource.removeEventListener('load', onload);\n resource.removeEventListener('error', onerror);\n resource.removeEventListener('abort', onabort);\n };\n resource.addEventListener('load', onload);\n resource.addEventListener('error', onerror);\n resource.addEventListener('abort', onabort);\n });\n };\n return FastAverageColor;\n}());\n\nexport { FastAverageColor };\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {\n TemplateResult,\n ChildPart,\n RootPart,\n render,\n nothing,\n CompiledTemplateResult,\n} from '../lit-html.js';\nimport {\n directive,\n Directive,\n DirectiveParameters,\n PartInfo,\n} from '../directive.js';\nimport {\n clearPart,\n getCommittedValue,\n insertPart,\n isCompiledTemplateResult,\n isTemplateResult,\n setCommittedValue,\n} from '../directive-helpers.js';\n\n/**\n * The template strings array contents are not compatible between the two\n * template result types as the compiled template contains a prepared string;\n * only use the returned template strings array as a cache key.\n */\nconst getStringsFromTemplateResult = (\n result: TemplateResult | CompiledTemplateResult\n): TemplateStringsArray =>\n isCompiledTemplateResult(result) ? result['_$litType$'].h : result.strings;\n\nclass CacheDirective extends Directive {\n private _templateCache = new WeakMap<TemplateStringsArray, RootPart>();\n private _value?: TemplateResult | CompiledTemplateResult;\n\n constructor(partInfo: PartInfo) {\n super(partInfo);\n }\n\n render(v: unknown) {\n // Return an array of the value to induce lit-html to create a ChildPart\n // for the value that we can move into the cache.\n return [v];\n }\n\n override update(containerPart: ChildPart, [v]: DirectiveParameters<this>) {\n const _valueKey = isTemplateResult(this._value)\n ? getStringsFromTemplateResult(this._value)\n : null;\n const vKey = isTemplateResult(v) ? getStringsFromTemplateResult(v) : null;\n\n // If the previous value is a TemplateResult and the new value is not,\n // or is a different Template as the previous value, move the child part\n // into the cache.\n if (_valueKey !== null && (vKey === null || _valueKey !== vKey)) {\n // This is always an array because we return [v] in render()\n const partValue = getCommittedValue(containerPart) as Array<ChildPart>;\n const childPart = partValue.pop()!;\n let cachedContainerPart = this._templateCache.get(_valueKey);\n if (cachedContainerPart === undefined) {\n const fragment = document.createDocumentFragment();\n cachedContainerPart = render(nothing, fragment);\n cachedContainerPart.setConnected(false);\n this._templateCache.set(_valueKey, cachedContainerPart);\n }\n // Move into cache\n setCommittedValue(cachedContainerPart, [childPart]);\n insertPart(cachedContainerPart, undefined, childPart);\n }\n // If the new value is a TemplateResult and the previous value is not,\n // or is a different Template as the previous value, restore the child\n // part from the cache.\n if (vKey !== null) {\n if (_valueKey === null || _valueKey !== vKey) {\n const cachedContainerPart = this._templateCache.get(vKey);\n if (cachedContainerPart !== undefined) {\n // Move the cached part back into the container part value\n const partValue = getCommittedValue(\n cachedContainerPart\n ) as Array<ChildPart>;\n const cachedPart = partValue.pop()!;\n // Move cached part back into DOM\n clearPart(containerPart);\n insertPart(containerPart, undefined, cachedPart);\n setCommittedValue(containerPart, [cachedPart]);\n }\n }\n // Because vKey is non null, v must be a TemplateResult.\n this._value = v as TemplateResult | CompiledTemplateResult;\n } else {\n this._value = undefined;\n }\n return this.render(v);\n }\n}\n\n/**\n * Enables fast switching between multiple templates by caching the DOM nodes\n * and TemplateInstances produced by the templates.\n *\n * Example:\n *\n * ```js\n * let checked = false;\n *\n * html`\n * ${cache(checked ? html`input is checked` : html`input is not checked`)}\n * `\n * ```\n */\nexport const cache = directive(CacheDirective);\n\n/**\n * The type of the class that powers this directive. Necessary for naming the\n * directive's return type.\n */\nexport type {CacheDirective};\n","/* eslint-disable no-undefined,no-param-reassign,no-shadow */\n\n/**\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher)\n * are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through,\n * as-is, to `callback` when the throttled-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.noTrailing] - Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds\n * while the throttled-function is being called. If noTrailing is false or unspecified, callback will be executed\n * one final time after the last throttled-function call. (After the throttled-function has not been called for\n * `delay` milliseconds, the internal counter is reset).\n * @param {boolean} [options.noLeading] - Optional, defaults to false. If noLeading is false, the first throttled-function call will execute callback\n * immediately. If noLeading is true, the first the callback execution will be skipped. It should be noted that\n * callback will never executed if both noLeading = true and noTrailing = true.\n * @param {boolean} [options.debounceMode] - If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is\n * false (at end), schedule `callback` to execute after `delay` ms.\n *\n * @returns {Function} A new, throttled, function.\n */\nexport default function (delay, callback, options) {\n\tconst {\n\t\tnoTrailing = false,\n\t\tnoLeading = false,\n\t\tdebounceMode = undefined\n\t} = options || {};\n\t/*\n\t * After wrapper has stopped being called, this timeout ensures that\n\t * `callback` is executed at the proper times in `throttle` and `end`\n\t * debounce modes.\n\t */\n\tlet timeoutID;\n\tlet cancelled = false;\n\n\t// Keep track of the last time `callback` was executed.\n\tlet lastExec = 0;\n\n\t// Function to clear existing timeout\n\tfunction clearExistingTimeout() {\n\t\tif (timeoutID) {\n\t\t\tclearTimeout(timeoutID);\n\t\t}\n\t}\n\n\t// Function to cancel next exec\n\tfunction cancel(options) {\n\t\tconst { upcomingOnly = false } = options || {};\n\t\tclearExistingTimeout();\n\t\tcancelled = !upcomingOnly;\n\t}\n\n\t/*\n\t * The `wrapper` function encapsulates all of the throttling / debouncing\n\t * functionality and when executed will limit the rate at which `callback`\n\t * is executed.\n\t */\n\tfunction wrapper(...arguments_) {\n\t\tlet self = this;\n\t\tlet elapsed = Date.now() - lastExec;\n\n\t\tif (cancelled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Execute `callback` and update the `lastExec` timestamp.\n\t\tfunction exec() {\n\t\t\tlastExec = Date.now();\n\t\t\tcallback.apply(self, arguments_);\n\t\t}\n\n\t\t/*\n\t\t * If `debounceMode` is true (at begin) this is used to clear the flag\n\t\t * to allow future `callback` executions.\n\t\t */\n\t\tfunction clear() {\n\t\t\ttimeoutID = undefined;\n\t\t}\n\n\t\tif (!noLeading && debounceMode && !timeoutID) {\n\t\t\t/*\n\t\t\t * Since `wrapper` is being called for the first time and\n\t\t\t * `debounceMode` is true (at begin), execute `callback`\n\t\t\t * and noLeading != true.\n\t\t\t */\n\t\t\texec();\n\t\t}\n\n\t\tclearExistingTimeout();\n\n\t\tif (debounceMode === undefined && elapsed > delay) {\n\t\t\tif (noLeading) {\n\t\t\t\t/*\n\t\t\t\t * In throttle mode with noLeading, if `delay` time has\n\t\t\t\t * been exceeded, update `lastExec` and schedule `callback`\n\t\t\t\t * to execute after `delay` ms.\n\t\t\t\t */\n\t\t\t\tlastExec = Date.now();\n\t\t\t\tif (!noTrailing) {\n\t\t\t\t\ttimeoutID = setTimeout(debounceMode ? clear : exec, delay);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * In throttle mode without noLeading, if `delay` time has been exceeded, execute\n\t\t\t\t * `callback`.\n\t\t\t\t */\n\t\t\t\texec();\n\t\t\t}\n\t\t} else if (noTrailing !== true) {\n\t\t\t/*\n\t\t\t * In trailing throttle mode, since `delay` time has not been\n\t\t\t * exceeded, schedule `callback` to execute `delay` ms after most\n\t\t\t * recent execution.\n\t\t\t *\n\t\t\t * If `debounceMode` is true (at begin), schedule `clear` to execute\n\t\t\t * after `delay` ms.\n\t\t\t *\n\t\t\t * If `debounceMode` is false (at end), schedule `callback` to\n\t\t\t * execute after `delay` ms.\n\t\t\t */\n\t\t\ttimeoutID = setTimeout(\n\t\t\t\tdebounceMode ? clear : exec,\n\t\t\t\tdebounceMode === undefined ? delay - elapsed : delay\n\t\t\t);\n\t\t}\n\t}\n\n\twrapper.cancel = cancel;\n\n\t// Return the wrapper function.\n\treturn wrapper;\n}\n","/* eslint-disable no-undefined */\n\nimport throttle from './throttle.js';\n\n/**\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.atBegin] - Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n *\n * @returns {Function} A new, debounced function.\n */\nexport default function (delay, callback, options) {\n\tconst { atBegin = false } = options || {};\n\treturn throttle(delay, callback, { debounceMode: atBegin !== false });\n}\n"],"mappings":"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","names":["i","FastAverageColor","getStringsFromTemplateResult","result","isCompiledTemplateResult","h","strings","cache","directive","Directive","partInfo","super","this","_templateCache","WeakMap","v","containerPart","_valueKey","isTemplateResult","_value","vKey","childPart","getCommittedValue","pop","cachedContainerPart","get","fragment","document","createDocumentFragment","render","nothing","setConnected","set","setCommittedValue","insertPart","cachedPart","clearPart","delay","callback","options","_ref","_ref$noTrailing","noTrailing","_ref$noLeading","noLeading","_ref$debounceMode","debounceMode","undefined","timeoutID","cancelled","lastExec","clearExistingTimeout","clearTimeout","cancel","_ref2","_ref2$upcomingOnly","upcomingOnly","wrapper","_len","arguments","length","arguments_","Array","_key","self","elapsed","Date","now","exec","apply","clear","setTimeout","_ref$atBegin","atBegin","throttle","p","d"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/blur/artwork-controller/element.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/artwork-controller/facet.html.txt
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/artwork-controller/facet.html.txt
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/index.css
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/index.css.map
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/index.html
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/index.html
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/index.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/index.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/variables.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/blur/variables.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/index.html
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/index.html
+291
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-WM2QH5TD.js"; 9 + import { 10 + foundation_default 11 + } from "../chunk-T6K5PZ3T.js"; 12 + import "../chunk-M4NQYVPY.js"; 13 + import "../chunk-4XYXC3TC.js"; 14 + import "../chunk-CTVRRF4G.js"; 15 + import "../chunk-IR27WFXT.js"; 16 + import "../chunk-C7BSJ3AC.js"; 17 + import "../chunk-CPS76EE2.js"; 18 + import "../chunk-MA2JKS5M.js"; 19 + import "../chunk-3SF5BNF4.js"; 20 + import "../chunk-6YF7B6KW.js"; 21 + import "../chunk-OIUQ2WMN.js"; 22 + import "../chunk-DG4EBNDV.js"; 23 + import "../chunk-R65OZ4FV.js"; 24 + import "../chunk-3G4WUGDN.js"; 25 + import "../chunk-P3M4HQTD.js"; 26 + import "../chunk-NMCS5TQK.js"; 27 + import "../chunk-OIQMICML.js"; 28 + import "../chunk-UACRVUBF.js"; 29 + import "../chunk-77ZY4GQV.js"; 30 + import "../chunk-WBRIGWBU.js"; 31 + import "../chunk-5UTOUDDD.js"; 32 + import "../chunk-4MLZJ4ZD.js"; 33 + import "../chunk-YMPAQN44.js"; 34 + import "../chunk-U74YW6XS.js"; 35 + import "../chunk-VK5BTHYP.js"; 36 + import "../chunk-4EGXANKE.js"; 37 + import "../chunk-AISBWLUT.js"; 38 + import "../chunk-JBHW662S.js"; 39 + import "../chunk-GX3WPNEX.js"; 40 + import "../chunk-LSHUSEQ5.js"; 41 + import "../chunk-SSTS6DW7.js"; 42 + import "../chunk-HN4F5JEZ.js"; 43 + import "../chunk-3VP55W4C.js"; 44 + import "../chunk-ETCOFMH2.js"; 45 + import "../chunk-GTZIAKZS.js"; 46 + import "../chunk-AGNDISJF.js"; 47 + import "../chunk-EEUCFWD4.js"; 48 + import "../chunk-6DRHTH2U.js"; 49 + import "../chunk-CW32SP4O.js"; 50 + import "../chunk-VKEUU6QK.js"; 51 + import "../chunk-EEVL24MR.js"; 52 + import "../chunk-H4FCSW7J.js"; 53 + import "../chunk-EXNT6GPY.js"; 54 + import "../chunk-JZ7ERCQK.js"; 55 + import "../chunk-NT5H3ES3.js"; 56 + import "../chunk-YGHHNA5S.js"; 57 + import { 58 + B, 59 + T 60 + } from "../chunk-H46AZIKM.js"; 61 + import "../chunk-G56PUJUJ.js"; 62 + import { 63 + effect, 64 + signal 65 + } from "../chunk-IZOBPV2S.js"; 66 + import "../chunk-EJ2QF5QE.js"; 67 + import "../chunk-NCFHYTLD.js"; 68 + import "../chunk-DUCTMCPX.js"; 69 + import "../chunk-UGE3FKYA.js"; 70 + import { 71 + themeFromUrl 72 + } from "../chunk-G2ZO6QIY.js"; 73 + import { 74 + qi 75 + } from "../chunk-PUHBIZRM.js"; 76 + import { 77 + create 78 + } from "../chunk-4YB6QUPN.js"; 79 + import { 80 + __name, 81 + init_Buffer, 82 + init_process 83 + } from "../chunk-FZQXS3RE.js"; 84 + 85 + // themes/index.js 86 + init_Buffer(); 87 + init_process(); 88 + document.body.addEventListener( 89 + "click", 90 + /** 91 + * @param {MouseEvent} event 92 + */ 93 + async (event) => { 94 + const target = ( 95 + /** @type {HTMLElement} */ 96 + event.target 97 + ); 98 + const rel = target.getAttribute("rel"); 99 + if (!rel) return; 100 + const url = target.closest("li")?.getAttribute("data-url"); 101 + if (!url) return; 102 + const name = target.closest("li")?.getAttribute("data-name"); 103 + if (!name) return; 104 + switch (rel) { 105 + case "fork": { 106 + const theme = await themeFromUrl({ name, url }, { fetchHTML: true }); 107 + editTheme(theme); 108 + document.querySelector("#build")?.scrollIntoView(); 109 + break; 110 + } 111 + case "save": { 112 + const theme = await themeFromUrl({ name, url }, { fetchHTML: false }); 113 + const out = foundation_default.orchestrator.output(); 114 + out.themes.save([ 115 + ...out.themes.collection(), 116 + theme 117 + ]); 118 + break; 119 + } 120 + } 121 + } 122 + ); 123 + var listEl = document.querySelector("#list"); 124 + if (!listEl) throw new Error("List element not found"); 125 + var output = foundation_default.orchestrator.output(); 126 + effect(() => { 127 + const col = output.themes.collection().sort((a, b) => { 128 + return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()); 129 + }); 130 + const h = col.length ? T` 131 + <ul> 132 + ${col.map( 133 + (c) => T` 134 + <li style="margin-bottom: var(--space-2xs)"> 135 + <span>${c.name}</span> 136 + <div class="list-description"> 137 + <div style="margin-bottom: var(--space-2xs)"> 138 + ${c.url && !c.html ? T` 139 + <span class="with-icon"> 140 + <i class="ph-fill ph-binoculars"></i> 141 + <span>Tracking the original <a href="${c.url}">URL</a></span> 142 + </span> 143 + ` : T` 144 + <span class="with-icon"> 145 + <i class="ph-fill ph-code"></i> 146 + <span>Custom code</span> 147 + </span> 148 + `} 149 + </div> 150 + <div class="button-row"> 151 + <a href="themes/l/?id=${c.id}" class="button button--bg-twist-1"> 152 + <span class="with-icon"> 153 + <i class="ph-fill ph-globe"></i> Open 154 + </span> 155 + </a> 156 + <button 157 + class="button--bg-twist-1 button--subtle" 158 + @click="${() => editTheme(c)}" 159 + > 160 + <span class="with-icon"> 161 + <i class="ph-fill ph-cursor-text"></i> Edit 162 + </span> 163 + </button> 164 + <button 165 + class="button--bg-twist-2 button--subtle" 166 + @click="${deleteTheme({ 167 + id: c.id 168 + })}" 169 + > 170 + <span class="with-icon"> 171 + <i class="ph-fill ph-eraser"></i> Delete 172 + </span> 173 + </button> 174 + </div> 175 + </div> 176 + </li> 177 + ` 178 + )} 179 + </ul> 180 + ` : output.themes.state() === "loaded" ? emptyThemesList : T` 181 + <i class="ph-bold ph-spinner-gap"></i> 182 + `; 183 + B(h, listEl); 184 + }); 185 + var emptyThemesList = T` 186 + <p style="margin-bottom: 0;"> 187 + <i class="ph-fill ph-info"></i> You have not saved any themes yet. 188 + </p> 189 + `; 190 + function deleteTheme({ id }) { 191 + return () => { 192 + const c = confirm("Are you sure you want to delete this theme?"); 193 + if (!c) return; 194 + output.themes.save( 195 + output.themes.collection().filter((c2) => !(c2.id === id)) 196 + ); 197 + }; 198 + } 199 + __name(deleteTheme, "deleteTheme"); 200 + var $editingTheme = signal( 201 + /** @type {Theme | null} */ 202 + null 203 + ); 204 + var editorContainer = document.body.querySelector("#html-input-container"); 205 + if (!editorContainer) throw new Error("Editor container not found"); 206 + var editor = new EditorView({ 207 + parent: editorContainer, 208 + doc: ``.trim(), 209 + extensions: [ 210 + basicSetup, 211 + html(), 212 + css(), 213 + javascript(), 214 + autocompletion() 215 + ] 216 + }); 217 + document.querySelector("#build-form")?.addEventListener( 218 + "submit", 219 + onBuildSubmit 220 + ); 221 + async function onBuildSubmit(event) { 222 + event.preventDefault(); 223 + const nameEl = ( 224 + /** @type {HTMLInputElement | null} */ 225 + document.querySelector( 226 + "#name-input" 227 + ) 228 + ); 229 + const html2 = editor.state.doc.toString(); 230 + const cid = await create(85, new TextEncoder().encode(html2)); 231 + const name = nameEl?.value ?? "nameless"; 232 + const theme = $editingTheme.value ? { 233 + ...$editingTheme.value, 234 + cid, 235 + html: html2, 236 + name 237 + } : { 238 + $type: "sh.diffuse.output.theme", 239 + id: crypto.randomUUID(), 240 + cid, 241 + html: html2, 242 + name 243 + }; 244 + switch ( 245 + /** @type {any} */ 246 + event.submitter.name 247 + ) { 248 + case "save": 249 + await saveTheme(theme); 250 + break; 251 + case "save+open": 252 + await saveTheme(theme); 253 + globalThis.open(`./themes/l/?id=${theme.id}`, "blank"); 254 + break; 255 + } 256 + } 257 + __name(onBuildSubmit, "onBuildSubmit"); 258 + async function editTheme(ogTheme) { 259 + const theme = { ...ogTheme }; 260 + const nameEl = ( 261 + /** @type {HTMLInputElement | null} */ 262 + document.querySelector( 263 + "#name-input" 264 + ) 265 + ); 266 + if (!nameEl) return; 267 + if (!theme.html && theme.url) { 268 + const html2 = await fetch(theme.url).then((res) => res.text()); 269 + const cid = await create(85, new TextEncoder().encode(html2)); 270 + theme.html = html2; 271 + theme.cid = cid; 272 + } 273 + $editingTheme.value = theme; 274 + nameEl.value = theme.name; 275 + editor.dispatch({ 276 + changes: { from: 0, to: editor.state.doc.length, insert: theme.html } 277 + }); 278 + } 279 + __name(editTheme, "editTheme"); 280 + async function saveTheme(theme) { 281 + const col = output.themes.collection(); 282 + const colWithoutId = col.filter((c) => c.id !== theme.id); 283 + const timestamp = qi.Now.zonedDateTimeISO().toString(); 284 + await output.themes.save([...colWithoutId, { 285 + ...theme, 286 + updatedAt: timestamp 287 + }]); 288 + } 289 + __name(saveTheme, "saveTheme"); 290 + 291 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import { Temporal } from \"@js-temporal/polyfill\";\nimport { html, render } from \"lit-html\";\n\nimport { basicSetup, EditorView } from \"codemirror\";\nimport { css as langCss } from \"@codemirror/lang-css\";\nimport { html as langHtml } from \"@codemirror/lang-html\";\nimport { javascript as langJs } from \"@codemirror/lang-javascript\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\n\nimport * as CID from \"@common/cid.js\";\nimport foundation from \"@common/facets/foundation.js\";\nimport { effect, signal } from \"@common/signal.js\";\nimport { themeFromUrl } from \"@common/themes/utils.js\";\n\n/**\n * @import {Theme} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// SAVE & FORK\n////////////////////////////////////////////\n\ndocument.body.addEventListener(\n \"click\",\n /**\n * @param {MouseEvent} event\n */\n async (event) => {\n const target = /** @type {HTMLElement} */ (event.target);\n const rel = target.getAttribute(\"rel\");\n if (!rel) return;\n\n const url = target.closest(\"li\")?.getAttribute(\"data-url\");\n if (!url) return;\n\n const name = target.closest(\"li\")?.getAttribute(\"data-name\");\n if (!name) return;\n\n switch (rel) {\n case \"fork\": {\n const theme = await themeFromUrl({ name, url }, { fetchHTML: true });\n editTheme(theme);\n document.querySelector(\"#build\")?.scrollIntoView();\n break;\n }\n case \"save\": {\n const theme = await themeFromUrl({ name, url }, { fetchHTML: false });\n const out = foundation.orchestrator.output();\n\n out.themes.save([\n ...out.themes.collection(),\n theme,\n ]);\n break;\n }\n }\n },\n);\n\n////////////////////////////////////////////\n// YOUR COLLECTION\n////////////////////////////////////////////\n\n/** @type {HTMLElement | null} */\nconst listEl = document.querySelector(\"#list\");\nif (!listEl) throw new Error(\"List element not found\");\n\nconst output = foundation.orchestrator.output();\n\neffect(() => {\n const col = output.themes.collection().sort((a, b) => {\n return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase());\n });\n\n const h = col.length\n ? html`\n <ul>\n ${col.map((c) =>\n html`\n <li style=\"margin-bottom: var(--space-2xs)\">\n <span>${c.name}</span>\n <div class=\"list-description\">\n <div style=\"margin-bottom: var(--space-2xs)\">\n ${c.url && !c.html\n ? html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-binoculars\"></i>\n <span>Tracking the original <a href=\"${c\n .url}\">URL</a></span>\n </span>\n `\n : html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-code\"></i>\n <span>Custom code</span>\n </span>\n `}\n </div>\n <div class=\"button-row\">\n <a href=\"themes/l/?id=${c\n .id}\" class=\"button button--bg-twist-1\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-globe\"></i> Open\n </span>\n </a>\n <button\n class=\"button--bg-twist-1 button--subtle\"\n @click=\"${() => editTheme(c)}\"\n >\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-cursor-text\"></i> Edit\n </span>\n </button>\n <button\n class=\"button--bg-twist-2 button--subtle\"\n @click=\"${deleteTheme({\n id: c.id,\n })}\"\n >\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-eraser\"></i> Delete\n </span>\n </button>\n </div>\n </div>\n </li>\n `\n )}\n </ul>\n `\n : output.themes.state() === \"loaded\"\n ? emptyThemesList\n : html`\n <i class=\"ph-bold ph-spinner-gap\"></i>\n `;\n\n render(h, listEl);\n});\n\nconst emptyThemesList = html`\n <p style=\"margin-bottom: 0;\">\n <i class=\"ph-fill ph-info\"></i> You have not saved any themes yet.\n </p>\n`;\n\n/**\n * @param {{ id: string }} _\n */\nfunction deleteTheme({ id }) {\n return () => {\n const c = confirm(\"Are you sure you want to delete this theme?\");\n if (!c) return;\n\n output.themes.save(\n output.themes.collection().filter((c) => !(c.id === id)),\n );\n };\n}\n\n////////////////////////////////////////////\n// BUILD\n////////////////////////////////////////////\n\nconst $editingTheme = signal(/** @type {Theme | null} */ (null));\n\n// Code editor\nconst editorContainer = document.body.querySelector(\"#html-input-container\");\nif (!editorContainer) throw new Error(\"Editor container not found\");\n\nconst editor = new EditorView({\n parent: editorContainer,\n doc: ``.trim(),\n extensions: [\n basicSetup,\n langHtml(),\n langCss(),\n langJs(),\n autocompletion(),\n ],\n});\n\n// Form submit\ndocument.querySelector(\"#build-form\")?.addEventListener(\n \"submit\",\n onBuildSubmit,\n);\n\n/**\n * @param {Event} event\n */\nasync function onBuildSubmit(event) {\n event.preventDefault();\n\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n const html = editor.state.doc.toString();\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n const name = nameEl?.value ?? \"nameless\";\n\n /** @type {Theme} */\n const theme = $editingTheme.value\n ? {\n ...$editingTheme.value,\n cid,\n html,\n name,\n }\n : {\n $type: \"sh.diffuse.output.theme\",\n id: crypto.randomUUID(),\n cid,\n html,\n name,\n };\n\n switch (/** @type {any} */ (event).submitter.name) {\n case \"save\":\n await saveTheme(theme);\n break;\n case \"save+open\":\n await saveTheme(theme);\n globalThis.open(`./themes/l/?id=${theme.id}`, \"blank\");\n break;\n }\n}\n\n/**\n * @param {Theme} ogTheme\n */\nasync function editTheme(ogTheme) {\n const theme = { ...ogTheme };\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n if (!nameEl) return;\n\n // Make sure HTML is loaded\n if (!theme.html && theme.url) {\n const html = await fetch(theme.url).then((res) => res.text());\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n\n theme.html = html;\n theme.cid = cid;\n }\n\n $editingTheme.value = theme;\n nameEl.value = theme.name;\n\n editor.dispatch({\n changes: { from: 0, to: editor.state.doc.length, insert: theme.html },\n });\n}\n\n/**\n * @param {Theme} theme\n */\nasync function saveTheme(theme) {\n const col = output.themes.collection();\n const colWithoutId = col.filter((c) => c.id !== theme.id);\n const timestamp = Temporal.Now.zonedDateTimeISO().toString();\n\n await output.themes.save([...colWithoutId, {\n ...theme,\n updatedAt: timestamp,\n }]);\n}\n"],"mappings":"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","names":["c","html"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/index.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/l/index.css
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/l/index.css.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/l/index.html
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.html
+115
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-T6K5PZ3T.js"; 4 + import "../../chunk-M4NQYVPY.js"; 5 + import "../../chunk-4XYXC3TC.js"; 6 + import "../../chunk-CTVRRF4G.js"; 7 + import "../../chunk-IR27WFXT.js"; 8 + import "../../chunk-C7BSJ3AC.js"; 9 + import "../../chunk-CPS76EE2.js"; 10 + import "../../chunk-MA2JKS5M.js"; 11 + import "../../chunk-3SF5BNF4.js"; 12 + import "../../chunk-6YF7B6KW.js"; 13 + import "../../chunk-OIUQ2WMN.js"; 14 + import "../../chunk-DG4EBNDV.js"; 15 + import "../../chunk-R65OZ4FV.js"; 16 + import "../../chunk-3G4WUGDN.js"; 17 + import "../../chunk-P3M4HQTD.js"; 18 + import "../../chunk-NMCS5TQK.js"; 19 + import "../../chunk-OIQMICML.js"; 20 + import "../../chunk-UACRVUBF.js"; 21 + import "../../chunk-77ZY4GQV.js"; 22 + import "../../chunk-WBRIGWBU.js"; 23 + import "../../chunk-5UTOUDDD.js"; 24 + import "../../chunk-4MLZJ4ZD.js"; 25 + import "../../chunk-YMPAQN44.js"; 26 + import "../../chunk-U74YW6XS.js"; 27 + import "../../chunk-VK5BTHYP.js"; 28 + import "../../chunk-4EGXANKE.js"; 29 + import "../../chunk-AISBWLUT.js"; 30 + import "../../chunk-JBHW662S.js"; 31 + import "../../chunk-GX3WPNEX.js"; 32 + import "../../chunk-LSHUSEQ5.js"; 33 + import "../../chunk-SSTS6DW7.js"; 34 + import "../../chunk-HN4F5JEZ.js"; 35 + import "../../chunk-3VP55W4C.js"; 36 + import "../../chunk-ETCOFMH2.js"; 37 + import "../../chunk-GTZIAKZS.js"; 38 + import "../../chunk-AGNDISJF.js"; 39 + import "../../chunk-EEUCFWD4.js"; 40 + import "../../chunk-6DRHTH2U.js"; 41 + import "../../chunk-CW32SP4O.js"; 42 + import "../../chunk-VKEUU6QK.js"; 43 + import "../../chunk-EEVL24MR.js"; 44 + import "../../chunk-H4FCSW7J.js"; 45 + import "../../chunk-EXNT6GPY.js"; 46 + import "../../chunk-JZ7ERCQK.js"; 47 + import "../../chunk-NT5H3ES3.js"; 48 + import "../../chunk-YGHHNA5S.js"; 49 + import "../../chunk-H46AZIKM.js"; 50 + import "../../chunk-G56PUJUJ.js"; 51 + import { 52 + effect 53 + } from "../../chunk-IZOBPV2S.js"; 54 + import "../../chunk-EJ2QF5QE.js"; 55 + import "../../chunk-NCFHYTLD.js"; 56 + import "../../chunk-DUCTMCPX.js"; 57 + import "../../chunk-UGE3FKYA.js"; 58 + import { 59 + create 60 + } from "../../chunk-4YB6QUPN.js"; 61 + import { 62 + __name, 63 + init_Buffer, 64 + init_process 65 + } from "../../chunk-FZQXS3RE.js"; 66 + 67 + // themes/l/index.js 68 + init_Buffer(); 69 + init_process(); 70 + var output = foundation_default.orchestrator.output(); 71 + var docUrl = new URL(document.location.href); 72 + var id = docUrl.searchParams.get("id"); 73 + var cid = docUrl.searchParams.get("cid"); 74 + var name = docUrl.searchParams.get("name"); 75 + var url = docUrl.searchParams.get("url"); 76 + var loadedCid = null; 77 + effect(async () => { 78 + const collection = output.themes.collection(); 79 + if (output.themes.state() !== "loaded") return; 80 + let theme; 81 + if (id) { 82 + theme = collection.find((t) => t.id === id); 83 + } else if (cid) { 84 + theme = collection.find((t) => t.cid === cid); 85 + } else if (name) { 86 + theme = collection.find((t) => t.name === name); 87 + } else if (url) { 88 + const t = { 89 + $type: "sh.diffuse.output.theme", 90 + id: crypto.randomUUID(), 91 + name: "tryout", 92 + url 93 + }; 94 + theme = t; 95 + } 96 + if (!theme) return; 97 + if (!theme.html && theme.url) { 98 + const html = await fetch(theme.url).then((res) => res.text()); 99 + const cid2 = await create(85, new TextEncoder().encode(html)); 100 + theme.html = html; 101 + theme.cid = cid2; 102 + } 103 + if (theme.cid === loadedCid) return; 104 + loadedCid = theme.cid ?? null; 105 + loadIntoContainer(theme); 106 + }); 107 + function loadIntoContainer(theme) { 108 + const iframe = document.createElement("iframe"); 109 + iframe.srcdoc = theme.html ?? ""; 110 + document.body.innerHTML = ""; 111 + document.body.append(iframe); 112 + } 113 + __name(loadIntoContainer, "loadIntoContainer"); 114 + 115 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/l/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import * as CID from \"@common/cid.js\";\nimport foundation from \"@common/facets/foundation.js\";\nimport { effect } from \"@common/signal.js\";\n\n/**\n * @import {Theme} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// OUTPUT\n////////////////////////////////////////////\n\nconst output = foundation.orchestrator.output();\n\n////////////////////////////////////////////\n// URL PARAMS\n////////////////////////////////////////////\n\nconst docUrl = new URL(document.location.href);\n\nconst id = docUrl.searchParams.get(\"id\");\nconst cid = docUrl.searchParams.get(\"cid\");\nconst name = docUrl.searchParams.get(\"name\");\nconst url = docUrl.searchParams.get(\"url\");\n\n////////////////////////////////////////////\n// LOAD\n////////////////////////////////////////////\n\n/** @type {string | null} */\nlet loadedCid = null;\n\neffect(async () => {\n const collection = output.themes.collection();\n if (output.themes.state() !== \"loaded\") return;\n\n let theme;\n\n if (id) {\n theme = collection.find((t) => t.id === id);\n } else if (cid) {\n theme = collection.find((t) => t.cid === cid);\n } else if (name) {\n theme = collection.find((t) => t.name === name);\n } else if (url) {\n /** @type {Theme} */\n const t = {\n $type: \"sh.diffuse.output.theme\",\n id: crypto.randomUUID(),\n name: \"tryout\",\n url,\n };\n\n theme = t;\n }\n\n // TODO: Message that theme was not found\n if (!theme) return;\n\n // Make sure HTML is loaded\n // TODO: Handle URL loading error\n if (!theme.html && theme.url) {\n const html = await fetch(theme.url).then((res) => res.text());\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n\n theme.html = html;\n theme.cid = cid;\n }\n\n if (theme.cid === loadedCid) return;\n\n loadedCid = theme.cid ?? null;\n loadIntoContainer(theme);\n});\n\n/**\n * @param {Theme} theme\n */\nfunction loadIntoContainer(theme) {\n // TODO: Validate if CID matches HTML\n\n const iframe = document.createElement(\"iframe\");\n iframe.srcdoc = theme.html ?? \"\";\n\n document.body.innerHTML = \"\";\n document.body.append(iframe);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAYA,IAAM,SAAS,mBAAW,aAAa,OAAO;AAM9C,IAAM,SAAS,IAAI,IAAI,SAAS,SAAS,IAAI;AAE7C,IAAM,KAAK,OAAO,aAAa,IAAI,IAAI;AACvC,IAAM,MAAM,OAAO,aAAa,IAAI,KAAK;AACzC,IAAM,OAAO,OAAO,aAAa,IAAI,MAAM;AAC3C,IAAM,MAAM,OAAO,aAAa,IAAI,KAAK;AAOzC,IAAI,YAAY;AAEhB,OAAO,YAAY;AACjB,QAAM,aAAa,OAAO,OAAO,WAAW;AAC5C,MAAI,OAAO,OAAO,MAAM,MAAM,SAAU;AAExC,MAAI;AAEJ,MAAI,IAAI;AACN,YAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EAC5C,WAAW,KAAK;AACd,YAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAAA,EAC9C,WAAW,MAAM;AACf,YAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAChD,WAAW,KAAK;AAEd,UAAM,IAAI;AAAA,MACR,OAAO;AAAA,MACP,IAAI,OAAO,WAAW;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,IACF;AAEA,YAAQ;AAAA,EACV;AAGA,MAAI,CAAC,MAAO;AAIZ,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK;AAC5B,UAAM,OAAO,MAAM,MAAM,MAAM,GAAG,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC;AAC5D,UAAMA,OAAM,MAAU,OAAO,IAAM,IAAI,YAAY,EAAE,OAAO,IAAI,CAAC;AAEjE,UAAM,OAAO;AACb,UAAM,MAAMA;AAAA,EACd;AAEA,MAAI,MAAM,QAAQ,UAAW;AAE7B,cAAY,MAAM,OAAO;AACzB,oBAAkB,KAAK;AACzB,CAAC;AAKD,SAAS,kBAAkB,OAAO;AAGhC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,SAAS,MAAM,QAAQ;AAE9B,WAAS,KAAK,YAAY;AAC1B,WAAS,KAAK,OAAO,MAAM;AAC7B;AARS;","names":["cid"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/l/index.js.map"}
+31
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css
··· 1 + :root, 2 + :host { 3 + line-height: 1.4; 4 + } 5 + 6 + fieldset + fieldset, 7 + fieldset + form { 8 + margin-top: var(--grouped-element-spacing); 9 + } 10 + 11 + form { 12 + margin-bottom: var(--grouped-element-spacing); 13 + } 14 + 15 + p, 16 + ul, 17 + ol { 18 + margin: var(--grouped-element-spacing) 0; 19 + } 20 + 21 + .with-icon { 22 + align-items: center; 23 + display: inline-flex; 24 + gap: var(--space-3xs); 25 + 26 + &.with-icon--large { 27 + gap: var(--space-xs); 28 + } 29 + } 30 + 31 + /*# sourceMappingURL=./98-extra.css.map */
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css.map
··· 1 + {"version":3,"sources":["/src/themes/webamp/98-extra.css"],"names":[],"mappings":"AAAA;;EAEE,gBAAgB;AAClB;;AAEA;;EAEE,0CAA0C;AAC5C;;AAEA;EACE,6CAA6C;AAC/C;;AAEA;;;EAGE,wCAAwC;AAC1C;;AAEA;EACE,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;;EAErB;IACE,oBAAoB;EACtB;AACF","file":"/themes/webamp/98-extra.css.map","sourcesContent":[":root,\n:host {\n line-height: 1.4;\n}\n\nfieldset + fieldset,\nfieldset + form {\n margin-top: var(--grouped-element-spacing);\n}\n\nform {\n margin-bottom: var(--grouped-element-spacing);\n}\n\np,\nul,\nol {\n margin: var(--grouped-element-spacing) 0;\n}\n\n.with-icon {\n align-items: center;\n display: inline-flex;\n gap: var(--space-3xs);\n\n &.with-icon--large {\n gap: var(--space-xs);\n }\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-vars.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-vars.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/browser/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-XWZFJSX5.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/browser/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/browser/element.js.map
+41
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/browser/facet.html.txt
··· 1 + <div class="window"> 2 + <div class="title-bar"> 3 + <div class="title-bar-icon"> 4 + <img src="images/icons/windows_98/directory_explorer-4.png" height="14" /> 5 + </div> 6 + <div class="title-bar-text" draggable="false">Browse collection</div> 7 + <div class="title-bar-controls"> 8 + <button aria-label="Close" onclick="window.close()"></button> 9 + </div> 10 + </div> 11 + <div class="window-body"> 12 + <div id="placeholder"></div> 13 + </div> 14 + </div> 15 + 16 + <style> 17 + @import "./styles/vendor/98.css"; 18 + @import "./themes/webamp/fonts.css"; 19 + @import "./themes/webamp/facet.css"; 20 + </style> 21 + 22 + <script type="module"> 23 + import foundation from "./common/facets/foundation.js"; 24 + import BrowserElement from "./themes/webamp/browser/element.js"; 25 + 26 + foundation.features.processInputs(); 27 + foundation.features.searchThroughCollection(); 28 + 29 + const out = foundation.orchestrator.output(); 30 + const que = foundation.engine.queue(); 31 + const scp = foundation.engine.scope(); 32 + const trc = foundation.orchestrator.scopedTracks(); 33 + 34 + const el = new BrowserElement(); 35 + el.setAttribute("output-selector", out.selector); 36 + el.setAttribute("queue-engine-selector", que.selector); 37 + el.setAttribute("scope-engine-selector", scp.selector); 38 + el.setAttribute("tracks-selector", trc.selector); 39 + 40 + document.querySelector("#placeholder")?.replaceWith(el); 41 + </script>
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/common/ui.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/common/ui.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/common/ui.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/common/ui.js.map
+27
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/configurators/input/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-4KKQSTV5.js"; 6 + import "../../../../chunk-3CXPPL5Z.js"; 7 + import "../../../../chunk-AISBWLUT.js"; 8 + import "../../../../chunk-JBHW662S.js"; 9 + import "../../../../chunk-GX3WPNEX.js"; 10 + import "../../../../chunk-HN4F5JEZ.js"; 11 + import "../../../../chunk-AGNDISJF.js"; 12 + import "../../../../chunk-EEUCFWD4.js"; 13 + import "../../../../chunk-6DRHTH2U.js"; 14 + import "../../../../chunk-EEVL24MR.js"; 15 + import "../../../../chunk-H46AZIKM.js"; 16 + import "../../../../chunk-G56PUJUJ.js"; 17 + import "../../../../chunk-IZOBPV2S.js"; 18 + import "../../../../chunk-EJ2QF5QE.js"; 19 + import "../../../../chunk-NCFHYTLD.js"; 20 + import "../../../../chunk-FZQXS3RE.js"; 21 + export { 22 + CLASS, 23 + NAME, 24 + element_default as default 25 + }; 26 + 27 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/configurators/input/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/configurators/input/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/configurators/input/facet.html.txt
··· 1 + ../../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/configurators/input/facet.html.txt
+24
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/configurators/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-HRFK436L.js"; 6 + import "../../../../chunk-NMCS5TQK.js"; 7 + import "../../../../chunk-OIQMICML.js"; 8 + import "../../../../chunk-UACRVUBF.js"; 9 + import "../../../../chunk-77ZY4GQV.js"; 10 + import "../../../../chunk-5UTOUDDD.js"; 11 + import "../../../../chunk-JBHW662S.js"; 12 + import "../../../../chunk-H46AZIKM.js"; 13 + import "../../../../chunk-G56PUJUJ.js"; 14 + import "../../../../chunk-IZOBPV2S.js"; 15 + import "../../../../chunk-EJ2QF5QE.js"; 16 + import "../../../../chunk-NCFHYTLD.js"; 17 + import "../../../../chunk-FZQXS3RE.js"; 18 + export { 19 + CLASS, 20 + NAME, 21 + element_default as default 22 + }; 23 + 24 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/configurators/output/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/configurators/output/element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/configurators/output/facet.html.txt
··· 1 + ../../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/configurators/output/facet.html.txt
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/facet.css
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/facet.css.map
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/fonts.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/fonts.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css.map
+155
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css
··· 1 + :root { 2 + /* Font scales */ 3 + --fs-3xs: clamp(0.41rem, -0.06vi + 0.42rem, 0.38rem); 4 + --fs-2xs: clamp(0.51rem, -0.02vi + 0.52rem, 0.5rem); 5 + --fs-xs: clamp(0.64rem, 0.05vi + 0.63rem, 0.67rem); 6 + --fs-sm: clamp(0.8rem, 0.17vi + 0.76rem, 0.89rem); 7 + --fs-base: clamp(1rem, 0.34vi + 0.91rem, 1.19rem); 8 + --fs-md: clamp(1.25rem, 0.61vi + 1.1rem, 1.58rem); 9 + --fs-lg: clamp(1.56rem, 1vi + 1.31rem, 2.11rem); 10 + --fs-xl: clamp(1.95rem, 1.56vi + 1.56rem, 2.81rem); 11 + --fs-2xl: clamp(2.44rem, 2.38vi + 1.85rem, 3.75rem); 12 + --fs-3xl: clamp(3.05rem, 3.54vi + 2.17rem, 5rem); 13 + 14 + /* Space scales */ 15 + --space-3xs: clamp(0.25rem, 0.2216rem + 0.1136vw, 0.3125rem); 16 + --space-2xs: clamp(0.5rem, 0.4432rem + 0.2273vw, 0.625rem); 17 + --space-xs: clamp(0.75rem, 0.6932rem + 0.2273vw, 0.875rem); 18 + --space-sm: clamp(1rem, 0.9148rem + 0.3409vw, 1.1875rem); 19 + --space-md: clamp(1.5rem, 1.358rem + 0.5682vw, 1.8125rem); 20 + --space-lg: clamp(2rem, 1.8295rem + 0.6818vw, 2.375rem); 21 + --space-xl: clamp(3rem, 2.7443rem + 1.0227vw, 3.5625rem); 22 + --space-2xl: clamp(4rem, 3.6591rem + 1.3636vw, 4.75rem); 23 + --space-3xl: clamp(6rem, 5.4886rem + 2.0455vw, 7.125rem); 24 + 25 + /* Border-radius */ 26 + --radius-xs: 0.125rem; 27 + --radius-sm: 0.25rem; 28 + --radius-md: 0.375rem; 29 + --radius-lg: 0.5rem; 30 + --radius-xl: 0.75rem; 31 + --radius-2xl: 1rem; 32 + --radius-3xl: 1.5rem; 33 + --radius-4xl: 2rem; 34 + 35 + /* Containers */ 36 + --container-3xs: 16rem; 37 + --container-2xs: 18rem; 38 + --container-xs: 20rem; 39 + --container-sm: 24rem; 40 + --container-md: 28rem; 41 + --container-lg: 32rem; 42 + --container-xl: 36rem; 43 + --container-2xl: 42rem; 44 + --container-3xl: 48rem; 45 + --container-4xl: 56rem; 46 + --container-5xl: 64rem; 47 + --container-6xl: 72rem; 48 + --container-7xl: 80rem; 49 + --container-8xl: 88rem; 50 + --container-9xl: 96rem; 51 + 52 + /* Letter-spacing */ 53 + --tracking-tighter: -0.05em; 54 + --tracking-tight: -0.025em; 55 + --tracking-normal: 0em; 56 + --tracking-wide: 0.025em; 57 + --tracking-wider: 0.05em; 58 + --tracking-widest: 0.1em; 59 + 60 + /* Line-height */ 61 + --leading-tight: 1.25; 62 + --leading-snug: 1.375; 63 + --leading-normal: 1.5; 64 + --leading-relaxed: 1.625; 65 + --leading-loose: 2; 66 + 67 + /* Shadows */ 68 + --box-shadow-2xs: 0 1px rgb(0 0 0 / 0.05); 69 + --box-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); 70 + --box-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); 71 + --box-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); 72 + --box-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); 73 + --box-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); 74 + --box-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); 75 + 76 + --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15); 77 + --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2); 78 + --text-shadow-sm: 79 + 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075); 80 + --text-shadow-md: 81 + 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1); 82 + --text-shadow-lg: 83 + 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1); 84 + } 85 + 86 + /*********************************** 87 + * 🪟 88 + ***********************************/ 89 + 90 + body { 91 + background: #3a6ea5; 92 + color: white; 93 + font-family: "Pixelated MS Sans Serif", sans-serif; 94 + font-size: 12px; 95 + margin: 12px; 96 + overflow: hidden; 97 + } 98 + 99 + #webamp { 100 + isolation: isolate; 101 + } 102 + 103 + main > section { 104 + inset: 0; 105 + position: absolute; 106 + } 107 + 108 + /*********************************** 109 + * Desktop 110 + ***********************************/ 111 + 112 + .desktop { 113 + align-items: start; 114 + display: flex; 115 + flex-wrap: wrap; 116 + gap: 12px; 117 + inset: 12px; 118 + } 119 + 120 + .desktop__item { 121 + align-items: center; 122 + background: transparent; 123 + border: 0; 124 + cursor: pointer; 125 + color: inherit; 126 + display: inline-flex; 127 + flex-direction: column; 128 + font-family: inherit; 129 + text-decoration: none; 130 + -webkit-user-select: none; 131 + user-select: none; 132 + 133 + &:visited, 134 + &:active { 135 + color: inherit; 136 + text-decoration: none; 137 + } 138 + 139 + & > label { 140 + cursor: inherit; 141 + margin-top: 4px; 142 + } 143 + 144 + &:focus { 145 + border: 0; 146 + outline: 0; 147 + 148 + & label { 149 + outline: 1px dotted white; 150 + outline-offset: 2px; 151 + } 152 + } 153 + } 154 + 155 + /*# sourceMappingURL=./index.css.map */
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css.map
··· 1 + {"version":3,"sources":["/src/styles/variables.css","/src/themes/webamp/index.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;EAChB,oDAAoD;EACpD,mDAAmD;EACnD,kDAAkD;EAClD,iDAAiD;EACjD,iDAAiD;EACjD,iDAAiD;EACjD,+CAA+C;EAC/C,kDAAkD;EAClD,mDAAmD;EACnD,gDAAgD;;EAEhD,iBAAiB;EACjB,4DAA4D;EAC5D,0DAA0D;EAC1D,0DAA0D;EAC1D,wDAAwD;EACxD,yDAAyD;EACzD,uDAAuD;EACvD,wDAAwD;EACxD,uDAAuD;EACvD,wDAAwD;;EAExD,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;EACnB,oBAAoB;EACpB,kBAAkB;EAClB,oBAAoB;EACpB,kBAAkB;;EAElB,eAAe;EACf,sBAAsB;EACtB,sBAAsB;EACtB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;;EAEtB,mBAAmB;EACnB,2BAA2B;EAC3B,0BAA0B;EAC1B,sBAAsB;EACtB,wBAAwB;EACxB,wBAAwB;EACxB,wBAAwB;;EAExB,gBAAgB;EAChB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,wBAAwB;EACxB,kBAAkB;;EAElB,YAAY;EACZ,yCAAyC;EACzC,8CAA8C;EAC9C,8EAA8E;EAC9E,iFAAiF;EACjF,mFAAmF;EACnF,oFAAoF;EACpF,qDAAqD;;EAErD,gDAAgD;EAChD,8CAA8C;EAC9C;kGACgG;EAChG;4FAC0F;EAC1F;4FAC0F;AAC5F;;ACjFA;;oCAEoC;;AAEpC;EACE,mBAAmB;EACnB,YAAY;EACZ,kDAAkD;EAClD,eAAe;EACf,YAAY;EACZ,gBAAgB;AAClB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,QAAQ;EACR,kBAAkB;AACpB;;AAEA;;oCAEoC;;AACpC;EACE,kBAAkB;EAClB,aAAa;EACb,eAAe;EACf,SAAS;EACT,WAAW;AACb;;AAEA;EACE,mBAAmB;EACnB,uBAAuB;EACvB,SAAS;EACT,eAAe;EACf,cAAc;EACd,oBAAoB;EACpB,sBAAsB;EACtB,oBAAoB;EACpB,qBAAqB;EACrB,yBAAiB;UAAjB,iBAAiB;;EAEjB;;IAEE,cAAc;IACd,qBAAqB;EACvB;;EAEA;IACE,eAAe;IACf,eAAe;EACjB;;EAEA;IACE,SAAS;IACT,UAAU;;IAEV;MACE,yBAAyB;MACzB,mBAAmB;IACrB;EACF;AACF","file":"/themes/webamp/index.css.map","sourcesContent":[":root {\n /* Font scales */\n --fs-3xs: clamp(0.41rem, -0.06vi + 0.42rem, 0.38rem);\n --fs-2xs: clamp(0.51rem, -0.02vi + 0.52rem, 0.5rem);\n --fs-xs: clamp(0.64rem, 0.05vi + 0.63rem, 0.67rem);\n --fs-sm: clamp(0.8rem, 0.17vi + 0.76rem, 0.89rem);\n --fs-base: clamp(1rem, 0.34vi + 0.91rem, 1.19rem);\n --fs-md: clamp(1.25rem, 0.61vi + 1.1rem, 1.58rem);\n --fs-lg: clamp(1.56rem, 1vi + 1.31rem, 2.11rem);\n --fs-xl: clamp(1.95rem, 1.56vi + 1.56rem, 2.81rem);\n --fs-2xl: clamp(2.44rem, 2.38vi + 1.85rem, 3.75rem);\n --fs-3xl: clamp(3.05rem, 3.54vi + 2.17rem, 5rem);\n\n /* Space scales */\n --space-3xs: clamp(0.25rem, 0.2216rem + 0.1136vw, 0.3125rem);\n --space-2xs: clamp(0.5rem, 0.4432rem + 0.2273vw, 0.625rem);\n --space-xs: clamp(0.75rem, 0.6932rem + 0.2273vw, 0.875rem);\n --space-sm: clamp(1rem, 0.9148rem + 0.3409vw, 1.1875rem);\n --space-md: clamp(1.5rem, 1.358rem + 0.5682vw, 1.8125rem);\n --space-lg: clamp(2rem, 1.8295rem + 0.6818vw, 2.375rem);\n --space-xl: clamp(3rem, 2.7443rem + 1.0227vw, 3.5625rem);\n --space-2xl: clamp(4rem, 3.6591rem + 1.3636vw, 4.75rem);\n --space-3xl: clamp(6rem, 5.4886rem + 2.0455vw, 7.125rem);\n\n /* Border-radius */\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-4xl: 2rem;\n\n /* Containers */\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n --container-8xl: 88rem;\n --container-9xl: 96rem;\n\n /* Letter-spacing */\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n\n /* Line-height */\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n\n /* Shadows */\n --box-shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n --box-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --box-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --box-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --box-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --box-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --box-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n --text-shadow-sm:\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);\n --text-shadow-md:\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);\n --text-shadow-lg:\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);\n}\n","@import \"../../styles/variables.css\";\n\n/***********************************\n * 🪟\n ***********************************/\n\nbody {\n background: #3a6ea5;\n color: white;\n font-family: \"Pixelated MS Sans Serif\", sans-serif;\n font-size: 12px;\n margin: 12px;\n overflow: hidden;\n}\n\n#webamp {\n isolation: isolate;\n}\n\nmain > section {\n inset: 0;\n position: absolute;\n}\n\n/***********************************\n * Desktop\n ***********************************/\n.desktop {\n align-items: start;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n inset: 12px;\n}\n\n.desktop__item {\n align-items: center;\n background: transparent;\n border: 0;\n cursor: pointer;\n color: inherit;\n display: inline-flex;\n flex-direction: column;\n font-family: inherit;\n text-decoration: none;\n user-select: none;\n\n &:visited,\n &:active {\n color: inherit;\n text-decoration: none;\n }\n\n & > label {\n cursor: inherit;\n margin-top: 4px;\n }\n\n &:focus {\n border: 0;\n outline: 0;\n\n & label {\n outline: 1px dotted white;\n outline-offset: 2px;\n }\n }\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+214
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <title>Diffuse</title> 7 + 8 + <!-- Base --> 9 + <base href="../../" /> 10 + 11 + <!-- Favicons & Mobile --> 12 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 13 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 14 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 15 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 16 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 17 + <meta name="msapplication-TileColor" content="#8a90a9" /> 18 + <meta name="theme-color" content="#8a90a9" /> 19 + 20 + <!-- Styles --> 21 + <link rel="stylesheet" href="themes/webamp/fonts.css" /> 22 + <link rel="stylesheet" href="themes/webamp/index.css" /> 23 + 24 + <!-- Scripts --> 25 + </head> 26 + <body> 27 + <!-- 28 + 29 + ################################### 30 + # UI 31 + ################################### 32 + 33 + --> 34 + <main> 35 + <!-- 🪟 --> 36 + <section class="windows"> 37 + <style> 38 + dtw-window-manager > * { 39 + left: 12px; 40 + position: absolute; 41 + top: 12px; 42 + z-index: 999; 43 + 44 + /* Waiting on https://developer.mozilla.org/en-US/docs/Web/CSS/sibling-index#browser_compatibility */ 45 + &:nth-child(1) { 46 + left: 24px; 47 + top: 24px; 48 + } 49 + 50 + &:nth-child(2) { 51 + left: 36px; 52 + top: 36px; 53 + } 54 + 55 + &:nth-child(3) { 56 + left: 48px; 57 + top: 48px; 58 + } 59 + 60 + &:nth-child(4) { 61 + left: 60px; 62 + top: 60px; 63 + } 64 + 65 + &:nth-child(5) { 66 + left: 72px; 67 + top: 72px; 68 + } 69 + 70 + &:nth-child(6) { 71 + left: 84px; 72 + top: 84px; 73 + } 74 + 75 + &:nth-child(7) { 76 + left: 96px; 77 + top: 96px; 78 + } 79 + 80 + &:nth-child(8) { 81 + left: 108px; 82 + top: 108px; 83 + } 84 + 85 + &:nth-child(9) { 86 + left: 120px; 87 + top: 120px; 88 + } 89 + } 90 + </style> 91 + 92 + <dtw-window-manager> 93 + <!-- INPUT --> 94 + <dtw-window id="input-window"> 95 + <span slot="title-icon"><img src="images/icons/windows_98/cd_audio_cd_a-0.png" height="14" /></span> 96 + <span slot="title">Manage audio inputs</span> 97 + 98 + <dtw-input-config 99 + input-selector="#input" 100 + output-selector="#output" 101 + sources-orchestrator-selector="do-sources" 102 + process-tracks-orchestrator-selector="do-process-tracks" 103 + ></dtw-input-config> 104 + </dtw-window> 105 + 106 + <!-- OUTPUT --> 107 + <dtw-window id="output-window"> 108 + <span slot="title-icon"><img src="images/icons/windows_98/computer_user_pencil-0.png" height="14" /></span> 109 + <span slot="title">Manage user data</span> 110 + 111 + <dtw-output-config 112 + output-selector="#output" 113 + ></dtw-output-config> 114 + </dtw-window> 115 + 116 + <!-- BROWSER --> 117 + <dtw-window id="browser-window" window-style="height: 380px; width: 560px;"> 118 + <span slot="title-icon"><img src="images/icons/windows_98/directory_explorer-4.png" height="14" /></span> 119 + <span slot="title">Browse collection</span> 120 + 121 + <dtw-browser 122 + output-selector="#output" 123 + queue-engine-selector="de-queue" 124 + scope-engine-selector="de-scope" 125 + tracks-selector="do-scoped-tracks" 126 + ></dtw-browser> 127 + </dtw-window> 128 + </dtw-window-manager> 129 + </section> 130 + 131 + <!-- 🛋️ --> 132 + <section class="desktop"> 133 + <!-- WINAMP --> 134 + <a class="button desktop__item" id="desktop-winamp"> 135 + <img src="images/icons/windows_98/winamp2-32x32.png" height="32" /> 136 + <label>Winamp</label> 137 + </a> 138 + 139 + <!-- INPUT --> 140 + <a class="button desktop__item"> 141 + <img src="images/icons/windows_98/cd_audio_cd_a-4.png" height="32" /> 142 + <label for="input-window">Manage audio inputs</label> 143 + </a> 144 + 145 + <!-- OUTPUT --> 146 + <a class="button desktop__item"> 147 + <img src="images/icons/windows_98/computer_user_pencil-0.png" height="32" /> 148 + <label for="output-window">Manage user data</label> 149 + </a> 150 + 151 + <!-- BROWSE --> 152 + <a class="button desktop__item"> 153 + <img src="images/icons/windows_98/directory_explorer-5.png" height="32" /> 154 + <label for="browser-window">Browse collection</label> 155 + </a> 156 + 157 + <!-- INSERT --> 158 + <a class="button desktop__item" id="desktop-batch"> 159 + <img src="images/icons/windows_98/multimedia-4.png" height="32" /> 160 + <label>Add shuffled batch</label> 161 + </a> 162 + </section> 163 + 164 + <!-- ⚡️ --> 165 + <dtw-webamp></dtw-webamp> 166 + </main> 167 + 168 + <!-- 169 + 170 + ################################### 171 + # COMPONENTS 172 + ################################### 173 + 174 + --> 175 + <de-queue></de-queue> 176 + <de-scope></de-scope> 177 + 178 + <!-- Processors --> 179 + <dp-metadata></dp-metadata> 180 + <dp-search></dp-search> 181 + 182 + <!-- Orchestrators --> 183 + <do-input id="input"></do-input> 184 + <do-output id="output"></do-output> 185 + 186 + <do-process-tracks 187 + input-selector="#input" 188 + metadata-processor-selector="dp-metadata" 189 + output-selector="#output" 190 + 191 + process-when-ready 192 + ></do-process-tracks> 193 + 194 + <do-scoped-tracks 195 + input-selector="#input" 196 + output-selector="#output" 197 + scope-engine-selector="de-scope" 198 + search-processor-selector="dp-search" 199 + ></do-scoped-tracks> 200 + 201 + <do-sources 202 + input-selector="#input" 203 + output-selector="#output" 204 + ></do-sources> 205 + 206 + <!-- 207 + 208 + SCRIPTS 209 + 210 + --> 211 + <script src="themes/webamp/index.js" type="module"></script> 212 + 213 + </body> 214 + </html>
+184
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.js
··· 1 + import "../../chunk-XWZFJSX5.js"; 2 + import "../../chunk-4KKQSTV5.js"; 3 + import "../../chunk-3CXPPL5Z.js"; 4 + import "../../chunk-HRFK436L.js"; 5 + import { 6 + element_default 7 + } from "../../chunk-2E662X3X.js"; 8 + import { 9 + element_default as element_default2 10 + } from "../../chunk-DH43DE2O.js"; 11 + import "../../chunk-2726SF3Z.js"; 12 + import "../../chunk-4XYXC3TC.js"; 13 + import { 14 + element_exports as element_exports3 15 + } from "../../chunk-CTVRRF4G.js"; 16 + import { 17 + element_exports as element_exports4 18 + } from "../../chunk-IR27WFXT.js"; 19 + import "../../chunk-MA2JKS5M.js"; 20 + import "../../chunk-3SF5BNF4.js"; 21 + import "../../chunk-6YF7B6KW.js"; 22 + import "../../chunk-OIUQ2WMN.js"; 23 + import "../../chunk-DG4EBNDV.js"; 24 + import "../../chunk-R65OZ4FV.js"; 25 + import "../../chunk-3G4WUGDN.js"; 26 + import "../../chunk-P3M4HQTD.js"; 27 + import "../../chunk-NMCS5TQK.js"; 28 + import "../../chunk-OIQMICML.js"; 29 + import "../../chunk-UACRVUBF.js"; 30 + import "../../chunk-77ZY4GQV.js"; 31 + import "../../chunk-WBRIGWBU.js"; 32 + import "../../chunk-5UTOUDDD.js"; 33 + import "../../chunk-4MLZJ4ZD.js"; 34 + import "../../chunk-U74YW6XS.js"; 35 + import "../../chunk-4EGXANKE.js"; 36 + import "../../chunk-AISBWLUT.js"; 37 + import "../../chunk-JBHW662S.js"; 38 + import "../../chunk-GX3WPNEX.js"; 39 + import "../../chunk-LSHUSEQ5.js"; 40 + import "../../chunk-SSTS6DW7.js"; 41 + import "../../chunk-HN4F5JEZ.js"; 42 + import "../../chunk-ETCOFMH2.js"; 43 + import "../../chunk-GTZIAKZS.js"; 44 + import "../../chunk-AGNDISJF.js"; 45 + import "../../chunk-EEUCFWD4.js"; 46 + import "../../chunk-6DRHTH2U.js"; 47 + import { 48 + element_exports as element_exports2 49 + } from "../../chunk-VKEUU6QK.js"; 50 + import "../../chunk-EEVL24MR.js"; 51 + import "../../chunk-H4FCSW7J.js"; 52 + import "../../chunk-EXNT6GPY.js"; 53 + import { 54 + element_exports 55 + } from "../../chunk-YGHHNA5S.js"; 56 + import { 57 + component 58 + } from "../../chunk-H46AZIKM.js"; 59 + import "../../chunk-G56PUJUJ.js"; 60 + import { 61 + effect, 62 + untracked 63 + } from "../../chunk-IZOBPV2S.js"; 64 + import "../../chunk-EJ2QF5QE.js"; 65 + import "../../chunk-NCFHYTLD.js"; 66 + import "../../chunk-DUCTMCPX.js"; 67 + import "../../chunk-UGE3FKYA.js"; 68 + import { 69 + __name, 70 + init_Buffer, 71 + init_process 72 + } from "../../chunk-FZQXS3RE.js"; 73 + 74 + // themes/webamp/index.js 75 + init_Buffer(); 76 + init_process(); 77 + var input = component(element_exports2); 78 + var queue = component(element_exports); 79 + var search = component(element_exports3); 80 + var scopedTracks = component(element_exports4); 81 + var output = document.querySelector("#output"); 82 + if (!output) throw new Error("Missing output element"); 83 + globalThis.queue = queue; 84 + globalThis.output = output; 85 + var index = {}; 86 + var initiatedPlaylist = false; 87 + var ampElement = document.querySelector("dtw-webamp"); 88 + if (ampElement instanceof element_default === false) { 89 + throw new Error("Missing webamp element"); 90 + } 91 + var amp = ampElement.amp; 92 + var loadFromUrl = amp.media.loadFromUrl.bind(amp.media); 93 + async function loadOverride(uri, autoPlay) { 94 + if (uri.startsWith("blob:")) { 95 + return await loadFromUrl(uri, autoPlay); 96 + } 97 + const resp = await input.resolve({ method: "GET", uri }); 98 + if (!resp) throw new Error("Failed to resolve URI"); 99 + if (resp && "stream" in resp) { 100 + throw new Error("Webamp does not support playing streams."); 101 + } 102 + return await loadFromUrl(resp.url, autoPlay); 103 + } 104 + __name(loadOverride, "loadOverride"); 105 + amp.media.loadFromUrl = loadOverride.bind(amp.media); 106 + effect(() => { 107 + const past = untracked(() => queue.past()); 108 + const now = untracked(() => queue.now()); 109 + const future = queue.future(); 110 + const list = [...past, ...now ? [now] : [], ...future]; 111 + const newIdx = {}; 112 + const idMap = {}; 113 + list.forEach((item) => { 114 + newIdx[item.id] = (newIdx[item.id] ?? 0) + 1; 115 + idMap[item.id] = item; 116 + }); 117 + const tracksToAdd = []; 118 + Object.entries(newIdx).forEach(([id, n]) => { 119 + const x = index[id] ?? 0; 120 + if (n > x) { 121 + tracksToAdd.push(idMap[id]); 122 + index[id] = x + 1; 123 + } 124 + }); 125 + tracksToAdd.forEach((t) => ampElement.addTrack(t)); 126 + if (!initiatedPlaylist && tracksToAdd.length) { 127 + initiatedPlaylist = true; 128 + amp.store.dispatch({ type: "BUFFER_TRACK", id: 0 }); 129 + } 130 + }); 131 + effect(() => { 132 + queue.supply({ tracks: scopedTracks.tracks() }); 133 + }); 134 + var tracksPromise = Promise.withResolvers(); 135 + effect(() => { 136 + const state = output.tracks.state(); 137 + if (state !== "loaded") return; 138 + const fingerprintSearch = search.supplyFingerprint(); 139 + if (fingerprintSearch === void 0) return; 140 + const fingerprintQueue = queue.supplyFingerprint(); 141 + if (fingerprintQueue === void 0) return; 142 + tracksPromise.resolve("loaded"); 143 + }); 144 + document.body.querySelectorAll(".desktop__item").forEach((element) => { 145 + if (element instanceof HTMLElement) { 146 + element.addEventListener("dblclick", () => { 147 + const f = element.querySelector("label")?.getAttribute("for"); 148 + if (f) return windowManager()?.toggleWindow(f); 149 + }); 150 + } 151 + }); 152 + document.body.querySelector("#desktop-batch")?.addEventListener( 153 + "dblclick", 154 + () => { 155 + tracksPromise.promise.then(() => { 156 + addBatch(); 157 + }); 158 + } 159 + ); 160 + var winampIsShown = true; 161 + document.body.querySelector("#desktop-winamp")?.addEventListener( 162 + "dblclick", 163 + () => { 164 + if (winampIsShown) { 165 + amp.close(); 166 + } else { 167 + amp.reopen(); 168 + winampIsShown = true; 169 + } 170 + } 171 + ); 172 + amp.onClose(() => winampIsShown = false); 173 + async function addBatch() { 174 + await queue.fill({ augment: true, amount: 50, shuffled: true }); 175 + } 176 + __name(addBatch, "addBatch"); 177 + function windowManager() { 178 + const w = document.body.querySelector("dtw-window-manager"); 179 + if (w instanceof element_default2) return w; 180 + return null; 181 + } 182 + __name(windowManager, "windowManager"); 183 + 184 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import \"@components/engine/scope/element.js\";\nimport \"@components/input/opensubsonic/element.js\";\nimport \"@components/input/s3/element.js\";\nimport \"@components/orchestrator/input/element.js\";\nimport \"@components/orchestrator/output/element.js\";\nimport \"@components/orchestrator/process-tracks/element.js\";\nimport \"@components/orchestrator/sources/element.js\";\nimport \"@components/processor/metadata/element.js\";\n\nimport * as Input from \"@components/configurator/input/element.js\";\nimport * as Queue from \"@components/engine/queue/element.js\";\nimport * as Search from \"@components/processor/search/element.js\";\nimport * as ScopedTracks from \"@components/orchestrator/scoped-tracks/element.js\";\n\nimport { component } from \"@common/element.js\";\nimport { effect, untracked } from \"@common/signal.js\";\n\nimport \"./browser/element.js\";\nimport \"./configurators/input/element.js\";\nimport \"./configurators/output/element.js\";\nimport \"./window/element.js\";\n\nimport WindowManager from \"./window-manager/element.js\";\nimport WebampElement from \"./webamp/element.js\";\n\n/**\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n */\n\nconst input = component(Input);\nconst queue = component(Queue);\nconst search = component(Search);\nconst scopedTracks = component(ScopedTracks);\n\n/** @type {OutputElement | null} */\nconst output = document.querySelector(\"#output\");\nif (!output) throw new Error(\"Missing output element\");\n\nglobalThis.queue = queue;\nglobalThis.output = output;\n\n////////////////////////////////////////////\n// 📡\n////////////////////////////////////////////\n\n/** @type {Record<string, number>} */\nconst index = {};\n\n/** @type {boolean} */\nlet initiatedPlaylist = false;\n\n////////////////////////////////////////////\n// ⚡️\n////////////////////////////////////////////\n\nconst ampElement = document.querySelector(\"dtw-webamp\");\nif (ampElement instanceof WebampElement === false) {\n throw new Error(\"Missing webamp element\");\n}\n\nconst amp = ampElement.amp;\n\n// Override track loader\nconst loadFromUrl = amp.media.loadFromUrl.bind(amp.media);\n\n/**\n * @param {string} uri\n * @param {boolean} autoPlay\n */\nasync function loadOverride(uri, autoPlay) {\n if (uri.startsWith(\"blob:\")) {\n return await loadFromUrl(uri, autoPlay);\n }\n\n const resp = await input.resolve({ method: \"GET\", uri });\n if (!resp) throw new Error(\"Failed to resolve URI\");\n if (resp && \"stream\" in resp) {\n throw new Error(\"Webamp does not support playing streams.\");\n }\n\n return await loadFromUrl(resp.url, autoPlay);\n}\n\namp.media.loadFromUrl = loadOverride.bind(amp.media);\n\n////////////////////////////////////////////\n// 📡\n////////////////////////////////////////////\n\n/**\n * Whenever the queue changes update the playlist.\n */\neffect(() => {\n const past = untracked(() => queue.past());\n const now = untracked(() => queue.now());\n const future = queue.future();\n const list = [...past, ...(now ? [now] : []), ...future];\n\n /** @type {Record<string, number>} */\n const newIdx = {};\n\n /** @type {Record<string, Track>} */\n const idMap = {};\n\n list.forEach((item) => {\n newIdx[item.id] = (newIdx[item.id] ?? 0) + 1;\n idMap[item.id] = item;\n });\n\n /** @type {Track[]} */\n const tracksToAdd = [];\n\n Object.entries(newIdx).forEach(([id, n]) => {\n const x = index[id] ?? 0;\n if (n > x) {\n tracksToAdd.push(idMap[id]);\n index[id] = x + 1;\n }\n });\n\n tracksToAdd.forEach((t) => ampElement.addTrack(t));\n\n if (!initiatedPlaylist && tracksToAdd.length) {\n initiatedPlaylist = true;\n amp.store.dispatch({ type: \"BUFFER_TRACK\", id: 0 });\n }\n});\n\n/**\n * Fill queue supply with available tracks.\n */\neffect(() => {\n queue.supply({ tracks: scopedTracks.tracks() });\n});\n\n/**\n * Keep note of when search is ready.\n */\nconst tracksPromise = Promise.withResolvers();\n\neffect(() => {\n const state = output.tracks.state();\n if (state !== \"loaded\") return;\n\n const fingerprintSearch = search.supplyFingerprint();\n if (fingerprintSearch === undefined) return;\n\n const fingerprintQueue = queue.supplyFingerprint();\n if (fingerprintQueue === undefined) return;\n\n tracksPromise.resolve(\"loaded\");\n});\n\n////////////////////////////////////////////\n// DESKTOP\n////////////////////////////////////////////\n\n// Open associated window when click desktop items\ndocument.body.querySelectorAll(\".desktop__item\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.addEventListener(\"dblclick\", () => {\n const f = element.querySelector(\"label\")?.getAttribute(\"for\");\n if (f) return windowManager()?.toggleWindow(f);\n });\n }\n});\n\n// Add batch\ndocument.body.querySelector(\"#desktop-batch\")?.addEventListener(\n \"dblclick\",\n () => {\n tracksPromise.promise.then(() => {\n addBatch();\n });\n },\n);\n\n// Toggle Winamp if click that desktop item\nlet winampIsShown = true;\n\ndocument.body.querySelector(\"#desktop-winamp\")?.addEventListener(\n \"dblclick\",\n () => {\n if (winampIsShown) {\n amp.close();\n } else {\n amp.reopen();\n winampIsShown = true;\n }\n },\n);\n\namp.onClose(() => winampIsShown = false);\n\n////////////////////////////////////////////\n// 🛠️\n////////////////////////////////////////////\n\nasync function addBatch() {\n await queue.fill({ augment: true, amount: 50, shuffled: true });\n}\n\nfunction windowManager() {\n const w = document.body.querySelector(\"dtw-window-manager\");\n if (w instanceof WindowManager) return w;\n return null;\n}\n"],"mappings":"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","names":["element_exports","element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/webamp/index.js.map"}
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/webamp/element.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/webamp/element.js
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/webamp/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/webamp/element.js.map
+19
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/window-manager/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-DH43DE2O.js"; 6 + import "../../../chunk-2726SF3Z.js"; 7 + import "../../../chunk-H46AZIKM.js"; 8 + import "../../../chunk-G56PUJUJ.js"; 9 + import "../../../chunk-IZOBPV2S.js"; 10 + import "../../../chunk-EJ2QF5QE.js"; 11 + import "../../../chunk-NCFHYTLD.js"; 12 + import "../../../chunk-FZQXS3RE.js"; 13 + export { 14 + CLASS, 15 + NAME, 16 + element_default as default 17 + }; 18 + 19 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/window-manager/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window-manager/element.js.map
+18
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/window/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-2726SF3Z.js"; 6 + import "../../../chunk-H46AZIKM.js"; 7 + import "../../../chunk-G56PUJUJ.js"; 8 + import "../../../chunk-IZOBPV2S.js"; 9 + import "../../../chunk-EJ2QF5QE.js"; 10 + import "../../../chunk-NCFHYTLD.js"; 11 + import "../../../chunk-FZQXS3RE.js"; 12 + export { 13 + CLASS, 14 + NAME, 15 + element_default as default 16 + }; 17 + 18 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/window/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window/element.js.map
+2 -2
artifacts/versions.json
··· 5 5 "version": "3.5.0" 6 6 }, 7 7 "4.0.0-alpha": { 8 - "cid": "bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq", 9 - "createdAt": "2026-02-16T18:22:12.701Z", 8 + "cid": "bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy", 9 + "createdAt": "2026-02-17T23:18:54.123Z", 10 10 "version": "4.0.0-alpha" 11 11 } 12 12 }