+3
-1
README.md
+3
-1
README.md
···
4
4
## How to use
5
5
6
6
1. Install `deno` and `fclones`
7
-
2. `deno run build`
7
+
2. `deno run build` or a deploy command as shown below.
8
8
9
9
10
10
## Deploying
11
+
12
+
Depending on the targetted platform, a different strategy might be applied. For example, we don't need to redirect rules for symlinks on IPFS because de-duplication is part of the protocol.
11
13
12
14
All the following commands perform a build automatically.
13
15
+4
artifacts/artifacts.json
+4
artifacts/artifacts.json
···
2
2
"bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni": {
3
3
"cid": "bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni",
4
4
"version": "4.0.0-alpha.1763310163"
5
+
},
6
+
"bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m": {
7
+
"cid": "bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m",
8
+
"version": "4.0.0-alpha.1763640482"
5
9
}
6
10
}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/APEv2Parser-2NHZAIBD.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/APEv2Parser-2NHZAIBD.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/APEv2Parser-2NHZAIBD.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/APEv2Parser-2NHZAIBD.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/APEv2Parser-2NHZAIBD.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/APEv2Parser-2NHZAIBD.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AiffParser-X2NDAJM5.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AiffParser-X2NDAJM5.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/AiffParser-X2NDAJM5.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AiffParser-X2NDAJM5.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AiffParser-X2NDAJM5.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/AiffParser-X2NDAJM5.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AsfParser-WRFL45A4.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AsfParser-WRFL45A4.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/AsfParser-WRFL45A4.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AsfParser-WRFL45A4.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/AsfParser-WRFL45A4.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/AsfParser-WRFL45A4.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsdiffParser-74XJNWY7.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsdiffParser-74XJNWY7.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/DsdiffParser-74XJNWY7.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsdiffParser-74XJNWY7.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsdiffParser-74XJNWY7.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/DsdiffParser-74XJNWY7.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsfParser-4LJJZG6Q.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsfParser-4LJJZG6Q.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/DsfParser-4LJJZG6Q.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsfParser-4LJJZG6Q.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/DsfParser-4LJJZG6Q.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/DsfParser-4LJJZG6Q.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/FlacParser-5TMEHXUG.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/FlacParser-5TMEHXUG.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/FlacParser-5TMEHXUG.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/FlacParser-5TMEHXUG.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/FlacParser-5TMEHXUG.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/FlacParser-5TMEHXUG.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MP4Parser-TPA7GYYK.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MP4Parser-TPA7GYYK.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MP4Parser-TPA7GYYK.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MP4Parser-TPA7GYYK.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MP4Parser-TPA7GYYK.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MP4Parser-TPA7GYYK.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MatroskaParser-JYEJ3HYT.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MatroskaParser-JYEJ3HYT.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MatroskaParser-JYEJ3HYT.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MatroskaParser-JYEJ3HYT.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MatroskaParser-JYEJ3HYT.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MatroskaParser-JYEJ3HYT.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MpegParser-JSFBNCT2.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MpegParser-JSFBNCT2.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MpegParser-JSFBNCT2.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MpegParser-JSFBNCT2.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MpegParser-JSFBNCT2.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MpegParser-JSFBNCT2.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MusepackParser-RLSCIJ3D.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MusepackParser-RLSCIJ3D.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MusepackParser-RLSCIJ3D.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MusepackParser-RLSCIJ3D.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/MusepackParser-RLSCIJ3D.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/MusepackParser-RLSCIJ3D.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/OggParser-7EGNDSTG.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/OggParser-7EGNDSTG.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/OggParser-7EGNDSTG.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/OggParser-7EGNDSTG.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/OggParser-7EGNDSTG.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/OggParser-7EGNDSTG.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WavPackParser-XWVVQCR4.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WavPackParser-XWVVQCR4.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/WavPackParser-XWVVQCR4.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WavPackParser-XWVVQCR4.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WavPackParser-XWVVQCR4.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/WavPackParser-XWVVQCR4.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WaveParser-OPGGWSJC.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WaveParser-OPGGWSJC.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/WaveParser-OPGGWSJC.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WaveParser-OPGGWSJC.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/WaveParser-OPGGWSJC.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/WaveParser-OPGGWSJC.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/android-chrome-192x192.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/android-chrome-192x192.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/android-chrome-192x192.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/android-chrome-512x512.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/android-chrome-512x512.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/android-chrome-512x512.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/apple-touch-icon.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/apple-touch-icon.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/apple-touch-icon.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/browserconfig.xml
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/browserconfig.xml
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/browserconfig.xml
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-22H6P5CP.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-22H6P5CP.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-22H6P5CP.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-22H6P5CP.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-22H6P5CP.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-22H6P5CP.js.map
+64
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2G4V2WLU.js
+64
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2G4V2WLU.js
···
1
+
import {
2
+
DiffuseElement
3
+
} from "./chunk-GULCWZMN.js";
4
+
import {
5
+
portProvider,
6
+
proxyProvider
7
+
} from "./chunk-SR6AOZ6U.js";
8
+
import {
9
+
__export,
10
+
__name
11
+
} from "./chunk-B2VGR7JE.js";
12
+
13
+
// components/input/opensubsonic/element.js
14
+
var element_exports = {};
15
+
__export(element_exports, {
16
+
CLASS: () => CLASS,
17
+
NAME: () => NAME,
18
+
default: () => element_default
19
+
});
20
+
var _OpensubsonicInput = class _OpensubsonicInput extends DiffuseElement {
21
+
constructor() {
22
+
super();
23
+
const worker = this.worker(this.group);
24
+
this.proxy = proxyProvider([
25
+
"consult",
26
+
"contextualize",
27
+
"groupConsult",
28
+
"list",
29
+
"resolve"
30
+
]);
31
+
const w = this.proxy(worker);
32
+
this.consult = w.consult;
33
+
this.contextualize = w.contextualize;
34
+
this.groupConsult = w.groupConsult;
35
+
this.list = w.list;
36
+
this.resolve = w.resolve;
37
+
this.port = portProvider(worker);
38
+
}
39
+
/**
40
+
* @param {string} [group]
41
+
*/
42
+
worker(group) {
43
+
const name = `diffuse/input/opensubsonic/${group || crypto.randomUUID()}`;
44
+
const url = import.meta.resolve(
45
+
"./components/input/opensubsonic/worker.js"
46
+
);
47
+
return new Worker(url, { name, type: "module" });
48
+
}
49
+
};
50
+
__name(_OpensubsonicInput, "OpensubsonicInput");
51
+
var OpensubsonicInput = _OpensubsonicInput;
52
+
var element_default = OpensubsonicInput;
53
+
var CLASS = OpensubsonicInput;
54
+
var NAME = "di-opensubsonic";
55
+
customElements.define(NAME, OpensubsonicInput);
56
+
57
+
export {
58
+
element_default,
59
+
CLASS,
60
+
NAME,
61
+
element_exports
62
+
};
63
+
64
+
//# sourceMappingURL=./chunk-2G4V2WLU.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2G4V2WLU.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2G4V2WLU.js.map
···
1
+
{"version":3,"sources":["/components/input/opensubsonic/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { portProvider, proxyProvider } from \"@common/worker.js\";\n\n/**\n * @import {InputActions} from \"@common/types.d.ts\"\n * @import {PortProviderMethod, ProxiedActions, ProxyProvider, ProxyProviderMethod} from \"@common/worker.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<InputActions>}\n * @implements {PortProviderMethod}\n * @implements {ProxyProviderMethod<InputActions>}\n */\nclass OpensubsonicInput extends DiffuseElement {\n constructor() {\n super();\n\n // Setup worker\n const worker = this.worker(this.group);\n\n /** @type {ProxyProvider<InputActions>} */\n this.proxy = proxyProvider([\n \"consult\",\n \"contextualize\",\n \"groupConsult\",\n \"list\",\n \"resolve\",\n ]);\n\n // Worker proxy\n const w = this.proxy(worker);\n\n this.consult = w.consult;\n this.contextualize = w.contextualize;\n this.groupConsult = w.groupConsult;\n this.list = w.list;\n this.resolve = w.resolve;\n\n // Provide a channel to the worker\n this.port = portProvider(worker);\n }\n\n /**\n * @param {string} [group]\n */\n worker(group) {\n const name = `diffuse/input/opensubsonic/${group || crypto.randomUUID()}`;\n const url = import.meta.resolve(\n \"./components/input/opensubsonic/worker.js\",\n );\n\n return new Worker(url, { name, type: \"module\" });\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, OpensubsonicInput);\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,IAAM,qBAAN,MAAM,2BAA0B,eAAe;AAAA,EAC7C,cAAc;AACZ,UAAM;AAGN,UAAM,SAAS,KAAK,OAAO,KAAK,KAAK;AAGrC,SAAK,QAAQ,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,IAAI,KAAK,MAAM,MAAM;AAE3B,SAAK,UAAU,EAAE;AACjB,SAAK,gBAAgB,EAAE;AACvB,SAAK,eAAe,EAAE;AACtB,SAAK,OAAO,EAAE;AACd,SAAK,UAAU,EAAE;AAGjB,SAAK,OAAO,aAAa,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO;AACZ,UAAM,OAAO,8BAA8B,SAAS,OAAO,WAAW,CAAC;AACvE,UAAM,MAAM,YAAY;AAAA,MACtB;AAAA,IACF;AAEA,WAAO,IAAI,OAAO,KAAK,EAAE,MAAM,MAAM,SAAS,CAAC;AAAA,EACjD;AACF;AAxC+C;AAA/C,IAAM,oBAAN;AA0CA,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-2G4V2WLU.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2KLIGTMI.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2KLIGTMI.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-2KLIGTMI.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2KLIGTMI.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-2KLIGTMI.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-2KLIGTMI.js.map
+43
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-3HGKPWGP.js
+43
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-3HGKPWGP.js
···
1
+
import {
2
+
DiffuseElement
3
+
} from "./chunk-GULCWZMN.js";
4
+
import {
5
+
proxyProvider
6
+
} from "./chunk-SR6AOZ6U.js";
7
+
import {
8
+
__name
9
+
} from "./chunk-B2VGR7JE.js";
10
+
11
+
// components/processor/metadata/element.js
12
+
var _MetadataProcessor = class _MetadataProcessor extends DiffuseElement {
13
+
constructor() {
14
+
super();
15
+
const worker = this.worker(this.group);
16
+
this.proxy = proxyProvider(["supply"]);
17
+
this.supply = this.proxy(worker).supply;
18
+
}
19
+
/**
20
+
* @param {string} [group]
21
+
*/
22
+
worker(group) {
23
+
const name = `diffuse/processor/metadata/${group || crypto.randomUUID()}`;
24
+
const url = import.meta.resolve(
25
+
"./components/processor/metadata/worker.js"
26
+
);
27
+
return new Worker(url, { name, type: "module" });
28
+
}
29
+
};
30
+
__name(_MetadataProcessor, "MetadataProcessor");
31
+
var MetadataProcessor = _MetadataProcessor;
32
+
var element_default = MetadataProcessor;
33
+
var CLASS = MetadataProcessor;
34
+
var NAME = "dp-metadata";
35
+
customElements.define(NAME, MetadataProcessor);
36
+
37
+
export {
38
+
element_default,
39
+
CLASS,
40
+
NAME
41
+
};
42
+
43
+
//# sourceMappingURL=./chunk-3HGKPWGP.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-3HGKPWGP.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-3HGKPWGP.js.map
···
1
+
{"version":3,"sources":["/components/processor/metadata/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { portProvider, proxyProvider } from \"@common/worker.js\";\n\n/**\n * @import {PortProviderMethod, ProxiedActions, ProxyProvider, ProxyProviderMethod, WorkerProviderMethod} 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 * @implements {WorkerProviderMethod}\n * @implements {ProxyProviderMethod<Actions>}\n */\nclass MetadataProcessor extends DiffuseElement {\n constructor() {\n super();\n\n // Setup worker\n const worker = this.worker(this.group);\n\n /** @type {ProxyProvider<Actions>} */\n this.proxy = proxyProvider([\"supply\"]);\n\n // Worker proxy\n this.supply = this.proxy(worker).supply;\n }\n\n /**\n * @param {string} [group]\n */\n worker(group) {\n const name = `diffuse/processor/metadata/${group || crypto.randomUUID()}`;\n const url = import.meta.resolve(\n \"./components/processor/metadata/worker.js\",\n );\n\n return new Worker(url, { name, type: \"module\" });\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":";;;;;;;;;;;AAiBA,IAAM,qBAAN,MAAM,2BAA0B,eAAe;AAAA,EAC7C,cAAc;AACZ,UAAM;AAGN,UAAM,SAAS,KAAK,OAAO,KAAK,KAAK;AAGrC,SAAK,QAAQ,cAAc,CAAC,QAAQ,CAAC;AAGrC,SAAK,SAAS,KAAK,MAAM,MAAM,EAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO;AACZ,UAAM,OAAO,8BAA8B,SAAS,OAAO,WAAW,CAAC;AACvE,UAAM,MAAM,YAAY;AAAA,MACtB;AAAA,IACF;AAEA,WAAO,IAAI,OAAO,KAAK,EAAE,MAAM,MAAM,SAAS,CAAC;AAAA,EACjD;AACF;AAzB+C;AAA/C,IAAM,oBAAN;AA2BA,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-3HGKPWGP.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-46FQFG3U.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-46FQFG3U.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-46FQFG3U.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-46FQFG3U.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-46FQFG3U.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-46FQFG3U.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4BP3OKIA.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4BP3OKIA.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-4BP3OKIA.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4BP3OKIA.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4BP3OKIA.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-4BP3OKIA.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4GRJPARV.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4GRJPARV.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-4GRJPARV.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4GRJPARV.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-4GRJPARV.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-4GRJPARV.js.map
+61
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7KGRAMQL.js
+61
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7KGRAMQL.js
···
1
+
import {
2
+
DiffuseElement,
3
+
query
4
+
} from "./chunk-GULCWZMN.js";
5
+
import {
6
+
computed,
7
+
signal
8
+
} from "./chunk-LGHY5MKC.js";
9
+
import {
10
+
__name
11
+
} from "./chunk-B2VGR7JE.js";
12
+
13
+
// components/transformer/output/string/json/element.js
14
+
var _JsonStringOutputTransformer = class _JsonStringOutputTransformer extends DiffuseElement {
15
+
constructor() {
16
+
super();
17
+
this.output = query(this, "output-selector");
18
+
const $defined = signal(false);
19
+
customElements.whenDefined(this.output.localName).then(
20
+
() => $defined.value = true
21
+
);
22
+
const manager = {
23
+
tracks: {
24
+
collection: computed(() => {
25
+
const json = $defined.value ? this.output.tracks?.collection() : [];
26
+
if (Array.isArray(json)) return json;
27
+
try {
28
+
return JSON.parse(json);
29
+
} catch (err) {
30
+
console.error(
31
+
"components/transformer/output/string/json: Failed to parse JSON"
32
+
);
33
+
return [];
34
+
}
35
+
}),
36
+
reload: /* @__PURE__ */ __name(() => this.output.tracks.reload(), "reload"),
37
+
save: /* @__PURE__ */ __name(async (newTracks) => {
38
+
const json = JSON.stringify(newTracks);
39
+
await customElements.whenDefined(this.output.localName);
40
+
await this.output.tracks.save(json);
41
+
}, "save"),
42
+
state: computed(() => this.output.tracks.state())
43
+
}
44
+
};
45
+
this.tracks = manager.tracks;
46
+
}
47
+
};
48
+
__name(_JsonStringOutputTransformer, "JsonStringOutputTransformer");
49
+
var JsonStringOutputTransformer = _JsonStringOutputTransformer;
50
+
var element_default = JsonStringOutputTransformer;
51
+
var CLASS = JsonStringOutputTransformer;
52
+
var NAME = "dtos-json";
53
+
customElements.define(NAME, CLASS);
54
+
55
+
export {
56
+
element_default,
57
+
CLASS,
58
+
NAME
59
+
};
60
+
61
+
//# sourceMappingURL=./chunk-7KGRAMQL.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7KGRAMQL.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7KGRAMQL.js.map
···
1
+
{"version":3,"sources":["/components/transformer/output/string/json/element.js"],"sourcesContent":["import { DiffuseElement, query } from \"@common/element.js\";\nimport { computed, signal } from \"@common/signal.js\";\n\n/**\n * @import { OutputElement, OutputManager } from \"../../../../output/types.d.ts\"\n * @import { Track } from \"@common/types.d.ts\"\n */\n\nclass JsonStringOutputTransformer extends DiffuseElement {\n constructor() {\n super();\n\n /** @type {OutputElement<string>} */\n this.output = query(this, \"output-selector\");\n\n // whenDefined signal\n const $defined = signal(false);\n\n customElements.whenDefined(this.output.localName).then(\n () => $defined.value = true,\n );\n\n /** @type {OutputManager<Track[]>} */\n const manager = {\n tracks: {\n collection: computed(() => {\n const json = $defined.value ? this.output.tracks?.collection() : [];\n\n // In addition to the above, Some polymorphic outputs\n // use an empty array as the default return value.\n if (Array.isArray(json)) return json;\n\n // Try parsing JSON\n try {\n return JSON.parse(json);\n } catch (err) {\n console.error(\n \"components/transformer/output/string/json: Failed to parse JSON\",\n );\n return [];\n }\n }),\n reload: () => this.output.tracks.reload(),\n save: async (newTracks) => {\n const json = JSON.stringify(newTracks);\n\n await customElements.whenDefined(this.output.localName);\n await this.output.tracks.save(json);\n },\n state: computed(() => this.output.tracks.state()),\n },\n };\n\n // Assign manager properties to class\n this.tracks = manager.tracks;\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":";;;;;;;;;;;;;AAQA,IAAM,+BAAN,MAAM,qCAAoC,eAAe;AAAA,EACvD,cAAc;AACZ,UAAM;AAGN,SAAK,SAAS,MAAM,MAAM,iBAAiB;AAG3C,UAAM,WAAW,OAAO,KAAK;AAE7B,mBAAe,YAAY,KAAK,OAAO,SAAS,EAAE;AAAA,MAChD,MAAM,SAAS,QAAQ;AAAA,IACzB;AAGA,UAAM,UAAU;AAAA,MACd,QAAQ;AAAA,QACN,YAAY,SAAS,MAAM;AACzB,gBAAM,OAAO,SAAS,QAAQ,KAAK,OAAO,QAAQ,WAAW,IAAI,CAAC;AAIlE,cAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAGhC,cAAI;AACF,mBAAO,KAAK,MAAM,IAAI;AAAA,UACxB,SAAS,KAAK;AACZ,oBAAQ;AAAA,cACN;AAAA,YACF;AACA,mBAAO,CAAC;AAAA,UACV;AAAA,QACF,CAAC;AAAA,QACD,QAAQ,6BAAM,KAAK,OAAO,OAAO,OAAO,GAAhC;AAAA,QACR,MAAM,8BAAO,cAAc;AACzB,gBAAM,OAAO,KAAK,UAAU,SAAS;AAErC,gBAAM,eAAe,YAAY,KAAK,OAAO,SAAS;AACtD,gBAAM,KAAK,OAAO,OAAO,KAAK,IAAI;AAAA,QACpC,GALM;AAAA,QAMN,OAAO,SAAS,MAAM,KAAK,OAAO,OAAO,MAAM,CAAC;AAAA,MAClD;AAAA,IACF;AAGA,SAAK,SAAS,QAAQ;AAAA,EACxB;AACF;AAhDyD;AAAzD,IAAM,8BAAN;AAkDA,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-7KGRAMQL.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7WBXGB7R.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7WBXGB7R.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-7WBXGB7R.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7WBXGB7R.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-7WBXGB7R.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-7WBXGB7R.js.map
+61
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-A3VEGVMA.js
+61
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-A3VEGVMA.js
···
1
+
import {
2
+
DiffuseElement,
3
+
query
4
+
} from "./chunk-GULCWZMN.js";
5
+
import {
6
+
untracked
7
+
} from "./chunk-LGHY5MKC.js";
8
+
import {
9
+
__name
10
+
} from "./chunk-B2VGR7JE.js";
11
+
12
+
// components/orchestrator/queue-tracks/element.js
13
+
var _QueueTracksOrchestrator = class _QueueTracksOrchestrator extends DiffuseElement {
14
+
constructor() {
15
+
super();
16
+
this.input = query(this, "input-selector");
17
+
this.output = query(this, "output-selector");
18
+
this.queue = query(this, "queue-engine-selector");
19
+
}
20
+
// LIFECYCLE
21
+
/**
22
+
* @override
23
+
*/
24
+
async connectedCallback() {
25
+
super.connectedCallback();
26
+
await customElements.whenDefined(this.output.localName);
27
+
this.effect(() => {
28
+
const tracks = this.output.tracks.collection().filter(
29
+
(t) => t.kind !== "placeholder"
30
+
);
31
+
untracked(() => this.poolAvailable(tracks));
32
+
});
33
+
}
34
+
// 🌊
35
+
/**
36
+
* @param {Track[]} cachedTracks
37
+
*/
38
+
async poolAvailable(cachedTracks) {
39
+
const groups = await this.input.groupConsult(cachedTracks);
40
+
let availableTracks = [];
41
+
Object.values(groups).forEach((value) => {
42
+
if (value.available === false) return;
43
+
availableTracks = availableTracks.concat(value.tracks);
44
+
}, []);
45
+
await this.queue.pool(availableTracks);
46
+
}
47
+
};
48
+
__name(_QueueTracksOrchestrator, "QueueTracksOrchestrator");
49
+
var QueueTracksOrchestrator = _QueueTracksOrchestrator;
50
+
var element_default = QueueTracksOrchestrator;
51
+
var CLASS = QueueTracksOrchestrator;
52
+
var NAME = "do-queue-tracks";
53
+
customElements.define(NAME, QueueTracksOrchestrator);
54
+
55
+
export {
56
+
element_default,
57
+
CLASS,
58
+
NAME
59
+
};
60
+
61
+
//# sourceMappingURL=./chunk-A3VEGVMA.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-A3VEGVMA.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-A3VEGVMA.js.map
···
1
+
{"version":3,"sources":["/components/orchestrator/queue-tracks/element.js"],"sourcesContent":["import { DiffuseElement, query } from \"@common/element.js\";\nimport { untracked } from \"@common/signal.js\";\n\n/**\n * @import {InputElement, Track} from \"@common/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * Update the queue pool whenever\n * tracks have been loaded,\n * or the tracks collection changes.\n */\nclass QueueTracksOrchestrator extends DiffuseElement {\n constructor() {\n super();\n\n /** @type {InputElement} */\n this.input = query(this, \"input-selector\");\n\n /** @type {OutputElement<Track[]>} */\n this.output = query(this, \"output-selector\");\n\n /** @type {import(\"@components/engine/queue/element.js\").CLASS} */\n this.queue = query(this, \"queue-engine-selector\");\n }\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\n\n // When defined\n await customElements.whenDefined(this.output.localName);\n\n // Watch tracks collection\n this.effect(() => {\n const tracks = this.output.tracks.collection().filter((t) =>\n t.kind !== \"placeholder\"\n );\n\n untracked(() => this.poolAvailable(tracks));\n });\n }\n\n // 🌊\n\n /**\n * @param {Track[]} cachedTracks\n */\n async poolAvailable(cachedTracks) {\n const groups = await this.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 this.queue.pool(availableTracks);\n }\n}\n\nexport default QueueTracksOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = QueueTracksOrchestrator;\nexport const NAME = \"do-queue-tracks\";\n\ncustomElements.define(NAME, QueueTracksOrchestrator);\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAM,2BAAN,MAAM,iCAAgC,eAAe;AAAA,EACnD,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,MAAM,MAAM,gBAAgB;AAGzC,SAAK,SAAS,MAAM,MAAM,iBAAiB;AAG3C,SAAK,QAAQ,MAAM,MAAM,uBAAuB;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAoB;AACxB,UAAM,kBAAkB;AAGxB,UAAM,eAAe,YAAY,KAAK,OAAO,SAAS;AAGtD,SAAK,OAAO,MAAM;AAChB,YAAM,SAAS,KAAK,OAAO,OAAO,WAAW,EAAE;AAAA,QAAO,CAAC,MACrD,EAAE,SAAS;AAAA,MACb;AAEA,gBAAU,MAAM,KAAK,cAAc,MAAM,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,cAAc;AAChC,UAAM,SAAS,MAAM,KAAK,MAAM,aAAa,YAAY;AAGzD,QAAI,kBAAkB,CAAC;AAEvB,WAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,UAAU;AACvC,UAAI,MAAM,cAAc,MAAO;AAC/B,wBAAkB,gBAAgB,OAAO,MAAM,MAAM;AAAA,IACvD,GAAG,CAAC,CAAC;AAGL,UAAM,KAAK,MAAM,KAAK,eAAe;AAAA,EACvC;AACF;AAtDqD;AAArD,IAAM,0BAAN;AAwDA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,uBAAuB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-A3VEGVMA.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-B2VGR7JE.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-B2VGR7JE.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-B2VGR7JE.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-B2VGR7JE.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-B2VGR7JE.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-B2VGR7JE.js.map
+68
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-BSW55ML6.js
+68
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-BSW55ML6.js
···
1
+
import {
2
+
DiffuseElement,
3
+
query
4
+
} from "./chunk-GULCWZMN.js";
5
+
import {
6
+
untracked
7
+
} from "./chunk-LGHY5MKC.js";
8
+
import {
9
+
__name
10
+
} from "./chunk-B2VGR7JE.js";
11
+
12
+
// components/orchestrator/queue-audio/element.js
13
+
var _QueueAudioOrchestrator = class _QueueAudioOrchestrator extends DiffuseElement {
14
+
constructor() {
15
+
super();
16
+
this.input = query(this, "input-selector");
17
+
this.audio = query(this, "audio-engine-selector");
18
+
this.queue = query(this, "queue-engine-selector");
19
+
}
20
+
// LIFECYCLE
21
+
/**
22
+
* @override
23
+
*/
24
+
async connectedCallback() {
25
+
super.connectedCallback();
26
+
await customElements.whenDefined(this.audio.localName);
27
+
await customElements.whenDefined(this.input.localName);
28
+
await customElements.whenDefined(this.queue.localName);
29
+
this.effect(() => this.monitorActiveQueueItem());
30
+
this.effect(() => this.monitorAudioEnd());
31
+
}
32
+
// 🛠️
33
+
async monitorActiveQueueItem() {
34
+
const activeTrack = this.queue.now();
35
+
const isPlaying = untracked(this.audio.isPlaying);
36
+
const resolvedUri = activeTrack ? await this.input.resolve({ method: "GET", uri: activeTrack.uri }) : void 0;
37
+
if (resolvedUri && "stream" in resolvedUri) {
38
+
throw new Error("Streams are not supported yet.");
39
+
}
40
+
const url = resolvedUri?.url;
41
+
if (this.queue.now?.()?.id !== activeTrack?.id) return;
42
+
this.audio.supply({
43
+
audio: activeTrack && url ? [{
44
+
id: activeTrack.id,
45
+
isPreload: false,
46
+
url
47
+
}] : [],
48
+
play: activeTrack && isPlaying ? { audioId: activeTrack.id } : void 0
49
+
});
50
+
}
51
+
async monitorAudioEnd() {
52
+
if (this.audio.hasEnded()) await this.queue.shift();
53
+
}
54
+
};
55
+
__name(_QueueAudioOrchestrator, "QueueAudioOrchestrator");
56
+
var QueueAudioOrchestrator = _QueueAudioOrchestrator;
57
+
var element_default = QueueAudioOrchestrator;
58
+
var CLASS = QueueAudioOrchestrator;
59
+
var NAME = "do-queue-audio";
60
+
customElements.define(NAME, QueueAudioOrchestrator);
61
+
62
+
export {
63
+
element_default,
64
+
CLASS,
65
+
NAME
66
+
};
67
+
68
+
//# sourceMappingURL=./chunk-BSW55ML6.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-BSW55ML6.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-BSW55ML6.js.map
···
1
+
{"version":3,"sources":["/components/orchestrator/queue-audio/element.js"],"sourcesContent":["import { DiffuseElement, query } from \"@common/element.js\";\nimport { untracked } from \"@common/signal.js\";\n\n/**\n * @import {InputElement} from \"@common/types.d.ts\"\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 DiffuseElement {\n constructor() {\n super();\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\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\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\n // Effects\n this.effect(() => this.monitorActiveQueueItem());\n this.effect(() => this.monitorAudioEnd());\n }\n\n // 🛠️\n\n async monitorActiveQueueItem() {\n const activeTrack = this.queue.now();\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.hasEnded()) await this.queue.shift();\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":";;;;;;;;;;;;AAkBA,IAAM,0BAAN,MAAM,gCAA+B,eAAe;AAAA,EAClD,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,MAAM,MAAM,gBAAgB;AAGzC,SAAK,QAAQ,MAAM,MAAM,uBAAuB;AAGhD,SAAK,QAAQ,MAAM,MAAM,uBAAuB;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAoB;AACxB,UAAM,kBAAkB;AAGxB,UAAM,eAAe,YAAY,KAAK,MAAM,SAAS;AACrD,UAAM,eAAe,YAAY,KAAK,MAAM,SAAS;AACrD,UAAM,eAAe,YAAY,KAAK,MAAM,SAAS;AAGrD,SAAK,OAAO,MAAM,KAAK,uBAAuB,CAAC;AAC/C,SAAK,OAAO,MAAM,KAAK,gBAAgB,CAAC;AAAA,EAC1C;AAAA;AAAA,EAIA,MAAM,yBAAyB;AAC7B,UAAM,cAAc,KAAK,MAAM,IAAI;AACnC,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,KAAK,MAAM,SAAS,EAAG,OAAM,KAAK,MAAM,MAAM;AAAA,EACpD;AACF;AAvEoD;AAApD,IAAM,yBAAN;AAyEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,sBAAsB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-BSW55ML6.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DHVMQUNY.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DHVMQUNY.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-DHVMQUNY.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DHVMQUNY.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DHVMQUNY.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-DHVMQUNY.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DNMGZHZC.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DNMGZHZC.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-DNMGZHZC.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DNMGZHZC.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-DNMGZHZC.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-DNMGZHZC.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-E253EVQW.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-E253EVQW.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-E253EVQW.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-E253EVQW.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-E253EVQW.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-E253EVQW.js.map
+105
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-FAZWEBEJ.js
+105
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-FAZWEBEJ.js
···
1
+
import {
2
+
hash
3
+
} from "./chunk-QL3YB5K6.js";
4
+
import {
5
+
query_string_default
6
+
} from "./chunk-7WBXGB7R.js";
7
+
import {
8
+
DiffuseElement
9
+
} from "./chunk-GULCWZMN.js";
10
+
import {
11
+
listen,
12
+
proxyProvider,
13
+
use
14
+
} from "./chunk-SR6AOZ6U.js";
15
+
import {
16
+
signal
17
+
} from "./chunk-LGHY5MKC.js";
18
+
import {
19
+
__export,
20
+
__name,
21
+
__privateAdd,
22
+
__privateGet,
23
+
__publicField
24
+
} from "./chunk-B2VGR7JE.js";
25
+
26
+
// components/engine/queue/element.js
27
+
var element_exports = {};
28
+
__export(element_exports, {
29
+
CLASS: () => CLASS,
30
+
NAME: () => NAME,
31
+
default: () => element_default
32
+
});
33
+
var _future, _now, _past, _poolHash;
34
+
var _QueueEngine = class _QueueEngine extends DiffuseElement {
35
+
constructor() {
36
+
super();
37
+
// SIGNALS
38
+
__privateAdd(this, _future, signal(
39
+
/** @type {Array<Item>} */
40
+
[]
41
+
));
42
+
__privateAdd(this, _now, signal(
43
+
/** @type {Item | null} */
44
+
null
45
+
));
46
+
__privateAdd(this, _past, signal(
47
+
/** @type {Array<Item>} */
48
+
[]
49
+
));
50
+
__privateAdd(this, _poolHash, signal(hash([])));
51
+
// STATE
52
+
__publicField(this, "future", __privateGet(this, _future).get);
53
+
__publicField(this, "now", __privateGet(this, _now).get);
54
+
__publicField(this, "past", __privateGet(this, _past).get);
55
+
__publicField(this, "poolHash", __privateGet(this, _poolHash).get);
56
+
const query = query_string_default.stringify({
57
+
"fill": this.getAttribute("fill")
58
+
});
59
+
const name = `diffuse/engine/queue/${this.group}`;
60
+
const url = `/components/engine/queue/worker.js?${query}`;
61
+
let port;
62
+
if (this.hasAttribute("group")) {
63
+
const worker = new SharedWorker(url, { name, type: "module" });
64
+
port = worker.port;
65
+
port.start();
66
+
} else {
67
+
const worker = new Worker(url, { name, type: "module" });
68
+
port = worker;
69
+
}
70
+
listen("future", __privateGet(this, _future).set, port);
71
+
listen("now", __privateGet(this, _now).set, port);
72
+
listen("past", __privateGet(this, _past).set, port);
73
+
listen("poolHash", __privateGet(this, _poolHash).set, port);
74
+
use("future", port)().then(__privateGet(this, _future).set);
75
+
use("now", port)().then(__privateGet(this, _now).set);
76
+
use("past", port)().then(__privateGet(this, _past).set);
77
+
use("poolHash", port)().then(__privateGet(this, _poolHash).set);
78
+
const proxy = proxyProvider(["add", "fill", "pool", "shift", "unshift"]);
79
+
const w = proxy(port);
80
+
this.add = w.add;
81
+
this.fill = w.fill;
82
+
this.pool = w.pool;
83
+
this.shift = w.shift;
84
+
this.unshift = w.unshift;
85
+
}
86
+
};
87
+
_future = new WeakMap();
88
+
_now = new WeakMap();
89
+
_past = new WeakMap();
90
+
_poolHash = new WeakMap();
91
+
__name(_QueueEngine, "QueueEngine");
92
+
var QueueEngine = _QueueEngine;
93
+
var element_default = QueueEngine;
94
+
var CLASS = QueueEngine;
95
+
var NAME = "de-queue";
96
+
customElements.define(NAME, QueueEngine);
97
+
98
+
export {
99
+
element_default,
100
+
CLASS,
101
+
NAME,
102
+
element_exports
103
+
};
104
+
105
+
//# sourceMappingURL=./chunk-FAZWEBEJ.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-FAZWEBEJ.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-FAZWEBEJ.js.map
···
1
+
{"version":3,"sources":["/components/engine/queue/element.js"],"sourcesContent":["import QS from \"query-string\";\n\nimport { DiffuseElement } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\nimport { listen, proxyProvider, use } from \"@common/worker.js\";\nimport { hash } from \"@common/index.js\";\n\n/**\n * @import {ProxiedActions, ProxyProvider} from \"@common/worker.d.ts\";\n * @import {Actions, Item} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<Actions>}\n */\nclass QueueEngine extends DiffuseElement {\n constructor() {\n super();\n\n // Query\n const query = QS.stringify({\n \"fill\": this.getAttribute(\"fill\"),\n });\n\n // Setup worker\n const name = `diffuse/engine/queue/${this.group}`;\n const url = `/components/engine/queue/worker.js?${query}`;\n\n let port;\n\n if (this.hasAttribute(\"group\")) {\n const worker = new SharedWorker(url, { name, type: \"module\" });\n port = worker.port;\n port.start();\n } else {\n const worker = new Worker(url, { name, type: \"module\" });\n port = worker;\n }\n\n // Sync data with worker\n listen(\"future\", this.#future.set, port);\n listen(\"now\", this.#now.set, port);\n listen(\"past\", this.#past.set, port);\n listen(\"poolHash\", this.#poolHash.set, port);\n\n use(\"future\", port)().then(this.#future.set);\n use(\"now\", port)().then(this.#now.set);\n use(\"past\", port)().then(this.#past.set);\n use(\"poolHash\", port)().then(this.#poolHash.set);\n\n /** @type {ProxyProvider<Actions>} */\n const proxy = proxyProvider([\"add\", \"fill\", \"pool\", \"shift\", \"unshift\"]);\n\n // Worker proxy\n const w = proxy(port);\n\n this.add = w.add;\n this.fill = w.fill;\n this.pool = w.pool;\n this.shift = w.shift;\n this.unshift = w.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 #poolHash = signal(hash([]));\n\n // STATE\n\n future = this.#future.get;\n now = this.#now.get;\n past = this.#past.get;\n poolHash = this.#poolHash.get;\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;AAmBA,IAAM,eAAN,MAAM,qBAAoB,eAAe;AAAA,EACvC,cAAc;AACZ,UAAM;AAgDR;AAAA,gCAAU;AAAA;AAAA,MAAmC,CAAC;AAAA,IAAE;AAChD,6BAAO;AAAA;AAAA,MAAmC;AAAA,IAAK;AAC/C,8BAAQ;AAAA;AAAA,MAAmC,CAAC;AAAA,IAAE;AAC9C,kCAAY,OAAO,KAAK,CAAC,CAAC,CAAC;AAI3B;AAAA,kCAAS,mBAAK,SAAQ;AACtB,+BAAM,mBAAK,MAAK;AAChB,gCAAO,mBAAK,OAAM;AAClB,oCAAW,mBAAK,WAAU;AAvDxB,UAAM,QAAQ,qBAAG,UAAU;AAAA,MACzB,QAAQ,KAAK,aAAa,MAAM;AAAA,IAClC,CAAC;AAGD,UAAM,OAAO,wBAAwB,KAAK,KAAK;AAC/C,UAAM,MAAM,sCAAsC,KAAK;AAEvD,QAAI;AAEJ,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,YAAM,SAAS,IAAI,aAAa,KAAK,EAAE,MAAM,MAAM,SAAS,CAAC;AAC7D,aAAO,OAAO;AACd,WAAK,MAAM;AAAA,IACb,OAAO;AACL,YAAM,SAAS,IAAI,OAAO,KAAK,EAAE,MAAM,MAAM,SAAS,CAAC;AACvD,aAAO;AAAA,IACT;AAGA,WAAO,UAAU,mBAAK,SAAQ,KAAK,IAAI;AACvC,WAAO,OAAO,mBAAK,MAAK,KAAK,IAAI;AACjC,WAAO,QAAQ,mBAAK,OAAM,KAAK,IAAI;AACnC,WAAO,YAAY,mBAAK,WAAU,KAAK,IAAI;AAE3C,QAAI,UAAU,IAAI,EAAE,EAAE,KAAK,mBAAK,SAAQ,GAAG;AAC3C,QAAI,OAAO,IAAI,EAAE,EAAE,KAAK,mBAAK,MAAK,GAAG;AACrC,QAAI,QAAQ,IAAI,EAAE,EAAE,KAAK,mBAAK,OAAM,GAAG;AACvC,QAAI,YAAY,IAAI,EAAE,EAAE,KAAK,mBAAK,WAAU,GAAG;AAG/C,UAAM,QAAQ,cAAc,CAAC,OAAO,QAAQ,QAAQ,SAAS,SAAS,CAAC;AAGvE,UAAM,IAAI,MAAM,IAAI;AAEpB,SAAK,MAAM,EAAE;AACb,SAAK,OAAO,EAAE;AACd,SAAK,OAAO,EAAE;AACd,SAAK,QAAQ,EAAE;AACf,SAAK,UAAU,EAAE;AAAA,EACnB;AAeF;AAXE;AACA;AACA;AACA;AArDuC;AAAzC,IAAM,cAAN;AA+DA,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-FAZWEBEJ.js.map"}
+525
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-GULCWZMN.js
+525
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-GULCWZMN.js
···
1
+
import {
2
+
define,
3
+
use
4
+
} from "./chunk-SR6AOZ6U.js";
5
+
import {
6
+
effect,
7
+
signal
8
+
} from "./chunk-LGHY5MKC.js";
9
+
import {
10
+
__name,
11
+
__privateAdd,
12
+
__privateGet,
13
+
__privateMethod,
14
+
__privateSet,
15
+
__publicField
16
+
} from "./chunk-B2VGR7JE.js";
17
+
18
+
// ../node_modules/.deno/lit-html@3.3.1/node_modules/lit-html/node/lit-html.js
19
+
var t = globalThis;
20
+
var i = t.trustedTypes;
21
+
var s = i ? i.createPolicy("lit-html", { createHTML: /* @__PURE__ */ __name((t2) => t2, "createHTML") }) : void 0;
22
+
var e = "$lit$";
23
+
var h = `lit$${Math.random().toFixed(9).slice(2)}$`;
24
+
var o = "?" + h;
25
+
var n = `<${o}>`;
26
+
var r = void 0 === t.document ? { createTreeWalker: /* @__PURE__ */ __name(() => ({}), "createTreeWalker") } : document;
27
+
var l = /* @__PURE__ */ __name(() => r.createComment(""), "l");
28
+
var c = /* @__PURE__ */ __name((t2) => null === t2 || "object" != typeof t2 && "function" != typeof t2, "c");
29
+
var a = Array.isArray;
30
+
var u = /* @__PURE__ */ __name((t2) => a(t2) || "function" == typeof t2?.[Symbol.iterator], "u");
31
+
var d = "[ \n\f\r]";
32
+
var f = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g;
33
+
var v = /-->/g;
34
+
var _ = />/g;
35
+
var m = RegExp(`>|${d}(?:([^\\s"'>=/]+)(${d}*=${d}*(?:[^
36
+
\f\r"'\`<>=]|("|')|))|$)`, "g");
37
+
var p = /'/g;
38
+
var g = /"/g;
39
+
var $ = /^(?:script|style|textarea|title)$/i;
40
+
var y = /* @__PURE__ */ __name((t2) => (i2, ...s2) => ({ _$litType$: t2, strings: i2, values: s2 }), "y");
41
+
var x = y(1);
42
+
var T = y(2);
43
+
var b = y(3);
44
+
var w = Symbol.for("lit-noChange");
45
+
var E = Symbol.for("lit-nothing");
46
+
var A = /* @__PURE__ */ new WeakMap();
47
+
var C = r.createTreeWalker(r, 129);
48
+
function P(t2, i2) {
49
+
if (!a(t2) || !t2.hasOwnProperty("raw")) throw Error("invalid template strings array");
50
+
return void 0 !== s ? s.createHTML(i2) : i2;
51
+
}
52
+
__name(P, "P");
53
+
var V = /* @__PURE__ */ __name((t2, i2) => {
54
+
const s2 = t2.length - 1, o2 = [];
55
+
let r2, l2 = 2 === i2 ? "<svg>" : 3 === i2 ? "<math>" : "", c2 = f;
56
+
for (let i3 = 0; i3 < s2; i3++) {
57
+
const s3 = t2[i3];
58
+
let a2, u2, d2 = -1, y2 = 0;
59
+
for (; y2 < s3.length && (c2.lastIndex = y2, u2 = c2.exec(s3), null !== u2); ) y2 = c2.lastIndex, c2 === f ? "!--" === u2[1] ? c2 = v : void 0 !== u2[1] ? c2 = _ : void 0 !== u2[2] ? ($.test(u2[2]) && (r2 = RegExp("</" + u2[2], "g")), c2 = m) : void 0 !== u2[3] && (c2 = m) : c2 === m ? ">" === u2[0] ? (c2 = r2 ?? f, d2 = -1) : void 0 === u2[1] ? d2 = -2 : (d2 = c2.lastIndex - u2[2].length, a2 = u2[1], c2 = void 0 === u2[3] ? m : '"' === u2[3] ? g : p) : c2 === g || c2 === p ? c2 = m : c2 === v || c2 === _ ? c2 = f : (c2 = m, r2 = void 0);
60
+
const x2 = c2 === m && t2[i3 + 1].startsWith("/>") ? " " : "";
61
+
l2 += c2 === f ? s3 + n : d2 >= 0 ? (o2.push(a2), s3.slice(0, d2) + e + s3.slice(d2) + h + x2) : s3 + h + (-2 === d2 ? i3 : x2);
62
+
}
63
+
return [P(t2, l2 + (t2[s2] || "<?>") + (2 === i2 ? "</svg>" : 3 === i2 ? "</math>" : "")), o2];
64
+
}, "V");
65
+
var _N = class _N {
66
+
constructor({ strings: t2, _$litType$: s2 }, n2) {
67
+
let r2;
68
+
this.parts = [];
69
+
let c2 = 0, a2 = 0;
70
+
const u2 = t2.length - 1, d2 = this.parts, [f2, v2] = V(t2, s2);
71
+
if (this.el = _N.createElement(f2, n2), C.currentNode = this.el.content, 2 === s2 || 3 === s2) {
72
+
const t3 = this.el.content.firstChild;
73
+
t3.replaceWith(...t3.childNodes);
74
+
}
75
+
for (; null !== (r2 = C.nextNode()) && d2.length < u2; ) {
76
+
if (1 === r2.nodeType) {
77
+
if (r2.hasAttributes()) for (const t3 of r2.getAttributeNames()) if (t3.endsWith(e)) {
78
+
const i2 = v2[a2++], s3 = r2.getAttribute(t3).split(h), e2 = /([.?@])?(.*)/.exec(i2);
79
+
d2.push({ type: 1, index: c2, name: e2[2], strings: s3, ctor: "." === e2[1] ? H : "?" === e2[1] ? I : "@" === e2[1] ? L : R }), r2.removeAttribute(t3);
80
+
} else t3.startsWith(h) && (d2.push({ type: 6, index: c2 }), r2.removeAttribute(t3));
81
+
if ($.test(r2.tagName)) {
82
+
const t3 = r2.textContent.split(h), s3 = t3.length - 1;
83
+
if (s3 > 0) {
84
+
r2.textContent = i ? i.emptyScript : "";
85
+
for (let i2 = 0; i2 < s3; i2++) r2.append(t3[i2], l()), C.nextNode(), d2.push({ type: 2, index: ++c2 });
86
+
r2.append(t3[s3], l());
87
+
}
88
+
}
89
+
} else if (8 === r2.nodeType) if (r2.data === o) d2.push({ type: 2, index: c2 });
90
+
else {
91
+
let t3 = -1;
92
+
for (; -1 !== (t3 = r2.data.indexOf(h, t3 + 1)); ) d2.push({ type: 7, index: c2 }), t3 += h.length - 1;
93
+
}
94
+
c2++;
95
+
}
96
+
}
97
+
static createElement(t2, i2) {
98
+
const s2 = r.createElement("template");
99
+
return s2.innerHTML = t2, s2;
100
+
}
101
+
};
102
+
__name(_N, "N");
103
+
var N = _N;
104
+
function S(t2, i2, s2 = t2, e2) {
105
+
if (i2 === w) return i2;
106
+
let h2 = void 0 !== e2 ? s2._$Co?.[e2] : s2._$Cl;
107
+
const o2 = c(i2) ? void 0 : i2._$litDirective$;
108
+
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 = S(t2, h2._$AS(t2, i2.values), h2, e2)), i2;
109
+
}
110
+
__name(S, "S");
111
+
var _M = class _M {
112
+
constructor(t2, i2) {
113
+
this._$AV = [], this._$AN = void 0, this._$AD = t2, this._$AM = i2;
114
+
}
115
+
get parentNode() {
116
+
return this._$AM.parentNode;
117
+
}
118
+
get _$AU() {
119
+
return this._$AM._$AU;
120
+
}
121
+
u(t2) {
122
+
const { el: { content: i2 }, parts: s2 } = this._$AD, e2 = (t2?.creationScope ?? r).importNode(i2, true);
123
+
C.currentNode = e2;
124
+
let h2 = C.nextNode(), o2 = 0, n2 = 0, l2 = s2[0];
125
+
for (; void 0 !== l2; ) {
126
+
if (o2 === l2.index) {
127
+
let i3;
128
+
2 === l2.type ? i3 = new k(h2, h2.nextSibling, this, t2) : 1 === l2.type ? i3 = new l2.ctor(h2, l2.name, l2.strings, this, t2) : 6 === l2.type && (i3 = new z(h2, this, t2)), this._$AV.push(i3), l2 = s2[++n2];
129
+
}
130
+
o2 !== l2?.index && (h2 = C.nextNode(), o2++);
131
+
}
132
+
return C.currentNode = r, e2;
133
+
}
134
+
p(t2) {
135
+
let i2 = 0;
136
+
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++;
137
+
}
138
+
};
139
+
__name(_M, "M");
140
+
var M = _M;
141
+
var _k = class _k {
142
+
get _$AU() {
143
+
return this._$AM?._$AU ?? this._$Cv;
144
+
}
145
+
constructor(t2, i2, s2, e2) {
146
+
this.type = 2, this._$AH = E, this._$AN = void 0, this._$AA = t2, this._$AB = i2, this._$AM = s2, this.options = e2, this._$Cv = e2?.isConnected ?? true;
147
+
}
148
+
get parentNode() {
149
+
let t2 = this._$AA.parentNode;
150
+
const i2 = this._$AM;
151
+
return void 0 !== i2 && 11 === t2?.nodeType && (t2 = i2.parentNode), t2;
152
+
}
153
+
get startNode() {
154
+
return this._$AA;
155
+
}
156
+
get endNode() {
157
+
return this._$AB;
158
+
}
159
+
_$AI(t2, i2 = this) {
160
+
t2 = S(this, t2, i2), c(t2) ? t2 === E || null == t2 || "" === t2 ? (this._$AH !== E && this._$AR(), this._$AH = E) : t2 !== this._$AH && t2 !== w && this._(t2) : void 0 !== t2._$litType$ ? this.$(t2) : void 0 !== t2.nodeType ? this.T(t2) : u(t2) ? this.k(t2) : this._(t2);
161
+
}
162
+
O(t2) {
163
+
return this._$AA.parentNode.insertBefore(t2, this._$AB);
164
+
}
165
+
T(t2) {
166
+
this._$AH !== t2 && (this._$AR(), this._$AH = this.O(t2));
167
+
}
168
+
_(t2) {
169
+
this._$AH !== E && c(this._$AH) ? this._$AA.nextSibling.data = t2 : this.T(r.createTextNode(t2)), this._$AH = t2;
170
+
}
171
+
$(t2) {
172
+
const { values: i2, _$litType$: s2 } = t2, e2 = "number" == typeof s2 ? this._$AC(t2) : (void 0 === s2.el && (s2.el = N.createElement(P(s2.h, s2.h[0]), this.options)), s2);
173
+
if (this._$AH?._$AD === e2) this._$AH.p(i2);
174
+
else {
175
+
const t3 = new M(e2, this), s3 = t3.u(this.options);
176
+
t3.p(i2), this.T(s3), this._$AH = t3;
177
+
}
178
+
}
179
+
_$AC(t2) {
180
+
let i2 = A.get(t2.strings);
181
+
return void 0 === i2 && A.set(t2.strings, i2 = new N(t2)), i2;
182
+
}
183
+
k(t2) {
184
+
a(this._$AH) || (this._$AH = [], this._$AR());
185
+
const i2 = this._$AH;
186
+
let s2, e2 = 0;
187
+
for (const h2 of t2) e2 === i2.length ? i2.push(s2 = new _k(this.O(l()), this.O(l()), this, this.options)) : s2 = i2[e2], s2._$AI(h2), e2++;
188
+
e2 < i2.length && (this._$AR(s2 && s2._$AB.nextSibling, e2), i2.length = e2);
189
+
}
190
+
_$AR(t2 = this._$AA.nextSibling, i2) {
191
+
for (this._$AP?.(false, true, i2); t2 !== this._$AB; ) {
192
+
const i3 = t2.nextSibling;
193
+
t2.remove(), t2 = i3;
194
+
}
195
+
}
196
+
setConnected(t2) {
197
+
void 0 === this._$AM && (this._$Cv = t2, this._$AP?.(t2));
198
+
}
199
+
};
200
+
__name(_k, "k");
201
+
var k = _k;
202
+
var _R = class _R {
203
+
get tagName() {
204
+
return this.element.tagName;
205
+
}
206
+
get _$AU() {
207
+
return this._$AM._$AU;
208
+
}
209
+
constructor(t2, i2, s2, e2, h2) {
210
+
this.type = 1, this._$AH = E, 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 = E;
211
+
}
212
+
_$AI(t2, i2 = this, s2, e2) {
213
+
const h2 = this.strings;
214
+
let o2 = false;
215
+
if (void 0 === h2) t2 = S(this, t2, i2, 0), o2 = !c(t2) || t2 !== this._$AH && t2 !== w, o2 && (this._$AH = t2);
216
+
else {
217
+
const e3 = t2;
218
+
let n2, r2;
219
+
for (t2 = h2[0], n2 = 0; n2 < h2.length - 1; n2++) r2 = S(this, e3[s2 + n2], i2, n2), r2 === w && (r2 = this._$AH[n2]), o2 ||= !c(r2) || r2 !== this._$AH[n2], r2 === E ? t2 = E : t2 !== E && (t2 += (r2 ?? "") + h2[n2 + 1]), this._$AH[n2] = r2;
220
+
}
221
+
o2 && !e2 && this.j(t2);
222
+
}
223
+
j(t2) {
224
+
t2 === E ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, t2 ?? "");
225
+
}
226
+
};
227
+
__name(_R, "R");
228
+
var R = _R;
229
+
var _H = class _H extends R {
230
+
constructor() {
231
+
super(...arguments), this.type = 3;
232
+
}
233
+
j(t2) {
234
+
this.element[this.name] = t2 === E ? void 0 : t2;
235
+
}
236
+
};
237
+
__name(_H, "H");
238
+
var H = _H;
239
+
var _I = class _I extends R {
240
+
constructor() {
241
+
super(...arguments), this.type = 4;
242
+
}
243
+
j(t2) {
244
+
this.element.toggleAttribute(this.name, !!t2 && t2 !== E);
245
+
}
246
+
};
247
+
__name(_I, "I");
248
+
var I = _I;
249
+
var _L = class _L extends R {
250
+
constructor(t2, i2, s2, e2, h2) {
251
+
super(t2, i2, s2, e2, h2), this.type = 5;
252
+
}
253
+
_$AI(t2, i2 = this) {
254
+
if ((t2 = S(this, t2, i2, 0) ?? E) === w) return;
255
+
const s2 = this._$AH, e2 = t2 === E && s2 !== E || t2.capture !== s2.capture || t2.once !== s2.once || t2.passive !== s2.passive, h2 = t2 !== E && (s2 === E || e2);
256
+
e2 && this.element.removeEventListener(this.name, this, s2), h2 && this.element.addEventListener(this.name, this, t2), this._$AH = t2;
257
+
}
258
+
handleEvent(t2) {
259
+
"function" == typeof this._$AH ? this._$AH.call(this.options?.host ?? this.element, t2) : this._$AH.handleEvent(t2);
260
+
}
261
+
};
262
+
__name(_L, "L");
263
+
var L = _L;
264
+
var _z = class _z {
265
+
constructor(t2, i2, s2) {
266
+
this.element = t2, this.type = 6, this._$AN = void 0, this._$AM = i2, this.options = s2;
267
+
}
268
+
get _$AU() {
269
+
return this._$AM._$AU;
270
+
}
271
+
_$AI(t2) {
272
+
S(this, t2);
273
+
}
274
+
};
275
+
__name(_z, "z");
276
+
var z = _z;
277
+
var Z = t.litHtmlPolyfillSupport;
278
+
Z?.(N, k), (t.litHtmlVersions ??= []).push("3.3.1");
279
+
var j = /* @__PURE__ */ __name((t2, i2, s2) => {
280
+
const e2 = s2?.renderBefore ?? i2;
281
+
let h2 = e2._$litPart$;
282
+
if (void 0 === h2) {
283
+
const t3 = s2?.renderBefore ?? null;
284
+
e2._$litPart$ = h2 = new k(i2.insertBefore(l(), t3), t3, void 0, s2 ?? {});
285
+
}
286
+
return h2._$AI(t2), h2;
287
+
}, "j");
288
+
289
+
// common/element.js
290
+
var _disposables, _DiffuseElement_instances, teardown_fn, render_fn;
291
+
var _DiffuseElement = class _DiffuseElement extends HTMLElement {
292
+
constructor() {
293
+
super();
294
+
__privateAdd(this, _DiffuseElement_instances);
295
+
__privateAdd(
296
+
this,
297
+
_disposables,
298
+
/** @type {Array<() => void>} */
299
+
[]
300
+
);
301
+
this.group = this.getAttribute("group") || crypto.randomUUID();
302
+
}
303
+
/**
304
+
* @param {string} _name
305
+
* @param {string} oldValue
306
+
* @param {string} newValue
307
+
*/
308
+
attributeChangedCallback(_name, oldValue, newValue) {
309
+
if (oldValue !== newValue) __privateMethod(this, _DiffuseElement_instances, render_fn).call(this);
310
+
}
311
+
/**
312
+
* Effect helper that automatically disposes it
313
+
* when this element is removed from the DOM.
314
+
*
315
+
* @param {() => void} fn
316
+
*/
317
+
effect(fn) {
318
+
__privateGet(this, _disposables).push(effect(fn));
319
+
}
320
+
/** */
321
+
forceRender() {
322
+
return __privateMethod(this, _DiffuseElement_instances, render_fn).call(this);
323
+
}
324
+
// LIFECYCLE
325
+
connectedCallback() {
326
+
if (!("render" in this && typeof this.render === "function")) return;
327
+
this.effect(() => {
328
+
if (!("render" in this && typeof this.render === "function")) return;
329
+
__privateMethod(this, _DiffuseElement_instances, render_fn).call(this);
330
+
});
331
+
}
332
+
disconnectedCallback() {
333
+
__privateMethod(this, _DiffuseElement_instances, teardown_fn).call(this);
334
+
}
335
+
};
336
+
_disposables = new WeakMap();
337
+
_DiffuseElement_instances = new WeakSet();
338
+
teardown_fn = /* @__PURE__ */ __name(function() {
339
+
__privateGet(this, _disposables).forEach((fn) => fn());
340
+
}, "#teardown");
341
+
/**
342
+
* Avoid replacing the whole subtree,
343
+
* morph the existing DOM into the new given tree.
344
+
*/
345
+
render_fn = /* @__PURE__ */ __name(function() {
346
+
if (!("render" in this && typeof this.render === "function")) return;
347
+
const tmp = this.render({
348
+
html: x,
349
+
state: "state" in this ? this.state : void 0
350
+
});
351
+
const root = this.shadowRoot ? this.shadowRoot : this;
352
+
j(tmp, root);
353
+
}, "#render");
354
+
__name(_DiffuseElement, "DiffuseElement");
355
+
var DiffuseElement = _DiffuseElement;
356
+
var _broadcastingStatus, _lock, _status;
357
+
var _BroadcastableDiffuseElement = class _BroadcastableDiffuseElement extends DiffuseElement {
358
+
constructor() {
359
+
super();
360
+
__publicField(this, "broadcasted", false);
361
+
__privateAdd(this, _broadcastingStatus);
362
+
__publicField(this, "broadcastingStatus");
363
+
/** @type {PromiseWithResolvers<void>} */
364
+
__privateAdd(this, _lock, Promise.withResolvers());
365
+
/** @type {PromiseWithResolvers<BroadcastingStatus>} */
366
+
__privateAdd(this, _status, Promise.withResolvers());
367
+
this.broadcast = this.broadcast.bind(this);
368
+
__privateSet(this, _broadcastingStatus, signal(__privateGet(this, _status).promise, { eager: true }));
369
+
this.broadcastingStatus = __privateGet(this, _broadcastingStatus).get;
370
+
}
371
+
/**
372
+
* @param {string} name
373
+
*/
374
+
broadcast(name) {
375
+
const channel = new BroadcastChannel(name);
376
+
const msg = new MessageChannel();
377
+
this.broadcasted = true;
378
+
this.name = name;
379
+
channel.addEventListener(
380
+
"message",
381
+
async (event) => {
382
+
const name2 = event.data.name?.split(":");
383
+
if (name2[0] === "leader") {
384
+
const status = await __privateGet(this, _status).promise;
385
+
if (status.leader) {
386
+
msg.port1.postMessage({
387
+
...event.data,
388
+
name: name2.splice(1).join(":")
389
+
});
390
+
}
391
+
} else {
392
+
msg.port1.postMessage(event.data);
393
+
}
394
+
}
395
+
);
396
+
msg.port1.addEventListener(
397
+
"message",
398
+
(event) => channel.postMessage(event.data)
399
+
);
400
+
msg.port1.start();
401
+
msg.port2.start();
402
+
async function anyoneWaiting() {
403
+
const state = await navigator.locks.query();
404
+
return !!state.pending?.length;
405
+
}
406
+
__name(anyoneWaiting, "anyoneWaiting");
407
+
return (method, fn) => {
408
+
define(method, fn.bind(this), msg.port2);
409
+
const leaderOnly = /* @__PURE__ */ __name(async (...args) => {
410
+
const status = await __privateGet(this, _status).promise;
411
+
return status.leader ? (
412
+
/** @type {R} */
413
+
fn.call(this, ...args)
414
+
) : (
415
+
/** @type {Promise<R>} */
416
+
use(`leader:${method}`, msg.port2)(
417
+
...args
418
+
)
419
+
);
420
+
}, "leaderOnly");
421
+
const replicate = /* @__PURE__ */ __name((...args) => {
422
+
anyoneWaiting().then((bool) => {
423
+
if (bool) use(method, msg.port2)(...args);
424
+
});
425
+
return (
426
+
/** @type {R} */
427
+
fn.call(this, ...args)
428
+
);
429
+
}, "replicate");
430
+
return {
431
+
leaderOnly,
432
+
replicate
433
+
};
434
+
};
435
+
}
436
+
// LIFECYCLE
437
+
/**
438
+
* @override
439
+
*/
440
+
connectedCallback() {
441
+
super.connectedCallback();
442
+
if (!this.broadcasted) return;
443
+
navigator.locks.request(
444
+
`${this.name}/lock`,
445
+
{ ifAvailable: true },
446
+
(lock) => {
447
+
__privateGet(this, _status).resolve(
448
+
lock ? { leader: true, initialLeader: true } : { leader: false }
449
+
);
450
+
if (lock) return __privateGet(this, _lock).promise;
451
+
}
452
+
);
453
+
__privateGet(this, _status).promise.then((status) => {
454
+
if (status.leader) {
455
+
console.log(`\u{1F9D9} Elected leader for: ${this.name}`);
456
+
} else {
457
+
console.log(`\u{1F52E} Watching leader: ${this.name}`);
458
+
}
459
+
if (status.leader === false) {
460
+
navigator.locks.request(
461
+
`${this.name}/lock`,
462
+
() => {
463
+
__privateSet(this, _status, Promise.withResolvers());
464
+
__privateGet(this, _status).resolve({ leader: true, initialLeader: false });
465
+
__privateGet(this, _broadcastingStatus).value = __privateGet(this, _status).promise;
466
+
return __privateGet(this, _lock).promise;
467
+
}
468
+
);
469
+
}
470
+
});
471
+
}
472
+
/**
473
+
* @override
474
+
*/
475
+
disconnectedCallback() {
476
+
super.disconnectedCallback();
477
+
__privateGet(this, _lock).resolve();
478
+
}
479
+
};
480
+
_broadcastingStatus = new WeakMap();
481
+
_lock = new WeakMap();
482
+
_status = new WeakMap();
483
+
__name(_BroadcastableDiffuseElement, "BroadcastableDiffuseElement");
484
+
var BroadcastableDiffuseElement = _BroadcastableDiffuseElement;
485
+
function component(elementModule, id) {
486
+
const el = document.querySelector(
487
+
id ? `${elementModule.NAME}#${id}` : elementModule.NAME
488
+
);
489
+
if (!el) {
490
+
throw new Error(`Element for selector '${elementModule.NAME}' not found.`);
491
+
}
492
+
return (
493
+
/** @type {InstanceType<C>} */
494
+
el
495
+
);
496
+
}
497
+
__name(component, "component");
498
+
function query(parent, attribute) {
499
+
const selector = parent.getAttribute(attribute);
500
+
if (!selector) {
501
+
throw new Error(`Missing required '${attribute}' attribute`);
502
+
}
503
+
const element = document.querySelector(selector);
504
+
if (!element) throw new Error(`Missing required '${selector}' element`);
505
+
return element;
506
+
}
507
+
__name(query, "query");
508
+
509
+
export {
510
+
DiffuseElement,
511
+
BroadcastableDiffuseElement,
512
+
component,
513
+
query
514
+
};
515
+
/*! Bundled license information:
516
+
517
+
lit-html/node/lit-html.js:
518
+
(**
519
+
* @license
520
+
* Copyright 2017 Google LLC
521
+
* SPDX-License-Identifier: BSD-3-Clause
522
+
*)
523
+
*/
524
+
525
+
//# sourceMappingURL=./chunk-GULCWZMN.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-GULCWZMN.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-GULCWZMN.js.map
···
1
+
{"version":3,"sources":["/node_modules/.deno/lit-html@3.3.1/node_modules/lit-html/src/lit-html.ts","/common/element.js"],"sourcesContent":["/**\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: HTMLElement | DocumentFragment;\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: HTMLElement | DocumentFragment;\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\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.1');\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: HTMLElement | DocumentFragment,\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","import { html, render } from \"lit-html\";\n\nimport { effect, signal } from \"@common/signal.js\";\nimport { define, use } from \"@common/worker.js\";\n\n/**\n * @import {BroadcastingStatus, FnParams, FnReturn} from \"./element.d.ts\"\n * @import {Signal} from \"./signal.d.ts\"\n */\n\n/**\n * Base for custom elements, provides some utility functionality\n * around rendering and managing signals.\n */\nexport class DiffuseElement extends HTMLElement {\n #disposables = /** @type {Array<() => void>} */ ([]);\n\n #teardown() {\n this.#disposables.forEach((fn) => fn());\n }\n\n constructor() {\n super();\n this.group = this.getAttribute(\"group\") || crypto.randomUUID();\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 disposes it\n * when this element is removed from the DOM.\n *\n * @param {() => void} fn\n */\n effect(fn) {\n this.#disposables.push(effect(fn));\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 const root = this.shadowRoot ? this.shadowRoot : this;\n render(tmp, root);\n }\n\n /** */\n forceRender() {\n return this.#render();\n }\n\n // LIFECYCLE\n\n connectedCallback() {\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.#teardown();\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 #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 * @param {string} name\n */\n broadcast(name) {\n const channel = new BroadcastChannel(name);\n const msg = new MessageChannel();\n\n this.broadcasted = true;\n this.name = name;\n\n channel.addEventListener(\n \"message\",\n async (event) => {\n const name = event.data.name?.split(\":\");\n\n if (name[0] === \"leader\") {\n const status = await this.#status.promise;\n if (status.leader) {\n msg.port1.postMessage({\n ...event.data,\n name: name.splice(1).join(\":\"),\n });\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 /**\n * @template I\n * @template O\n * @template {(...args: I[]) => O} Fn\n * @param {string} method\n * @param {Fn} fn\n */\n return (method, fn) => {\n define(method, fn.bind(this), msg.port2);\n\n /**\n * @typedef {FnParams<typeof fn>} P\n * @typedef {FnReturn<typeof fn>} R\n */\n\n /** @param {P} args */\n const leaderOnly = async (...args) => {\n const status = await this.#status.promise;\n return status.leader\n ? /** @type {R} */ (fn.call(this, ...args))\n : /** @type {Promise<R>} */ (use(`leader:${method}`, msg.port2)(\n ...args,\n ));\n };\n\n /**\n * @param {P} args\n * @returns {R}\n */\n const replicate = (...args) => {\n anyoneWaiting().then((bool) => {\n if (bool) use(method, msg.port2)(...args);\n });\n return /** @type {R} */ (fn.call(this, ...args));\n };\n\n return {\n leaderOnly,\n replicate,\n };\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,\n // and hold it until `this.lock.promise` resolves.\n navigator.locks.request(\n `${this.name}/lock`,\n { 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\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.name}`);\n } else {\n console.log(`🔮 Watching leader: ${this.name}`);\n }\n\n // Wait for leadership\n if (status.leader === false) {\n navigator.locks.request(\n `${this.name}/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\n return element;\n}\n"],"mappings":"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","names":["global","globalThis","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","node","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","polyfillSupport","global","litHtmlPolyfillSupport","Template","ChildPart","litHtmlVersions","push","render","value","container","options","partOwnerNode","renderBefore","part","endNode","insertBefore","createMarker","_$setValue","name"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-GULCWZMN.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-IAK2ZZZ5.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-IAK2ZZZ5.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-IAK2ZZZ5.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-IAK2ZZZ5.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-IAK2ZZZ5.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-IAK2ZZZ5.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JIV2BMIF.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JIV2BMIF.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-JIV2BMIF.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JIV2BMIF.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JIV2BMIF.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-JIV2BMIF.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JMCNYZY6.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JMCNYZY6.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-JMCNYZY6.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JMCNYZY6.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-JMCNYZY6.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-JMCNYZY6.js.map
+113
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-K5J7GJD6.js
+113
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-K5J7GJD6.js
···
1
+
import {
2
+
DiffuseElement
3
+
} from "./chunk-GULCWZMN.js";
4
+
import {
5
+
__name,
6
+
__publicField
7
+
} from "./chunk-B2VGR7JE.js";
8
+
9
+
// themes/webamp/window/element.js
10
+
var _WindowElement = class _WindowElement extends DiffuseElement {
11
+
constructor() {
12
+
super();
13
+
this.id = this.id?.length ? this.id : crypto.randomUUID();
14
+
this.attachShadow({ mode: "open" });
15
+
}
16
+
// ACTIONS
17
+
activate() {
18
+
this.shadowRoot?.querySelector(".title-bar")?.classList.remove("inactive");
19
+
}
20
+
deactivate() {
21
+
this.shadowRoot?.querySelector(".title-bar")?.classList.add("inactive");
22
+
}
23
+
// RENDER
24
+
/**
25
+
* @param {RenderArg} _
26
+
*/
27
+
render({ html }) {
28
+
return html`
29
+
<link rel="stylesheet" href="../../styles/vendor/98.css" />
30
+
31
+
<style>
32
+
dialog {
33
+
background: transparent;
34
+
border: 0;
35
+
padding: 0;
36
+
}
37
+
38
+
.window {
39
+
min-width: 240px;
40
+
}
41
+
42
+
.title-bar {
43
+
justify-content: unset;
44
+
user-select: none;
45
+
}
46
+
47
+
.title-bar-icon {
48
+
margin-right: 4px;
49
+
}
50
+
51
+
.title-bar-text {
52
+
flex: 1;
53
+
}
54
+
</style>
55
+
56
+
<dialog ?open="${this.hasAttribute("open")}">
57
+
<div class="window">
58
+
<div
59
+
class="title-bar"
60
+
@mousedown="${this.titleBarMouseDown}"
61
+
>
62
+
<div class="title-bar-icon">
63
+
<slot name="title-icon"></slot>
64
+
</div>
65
+
<div class="title-bar-text" draggable="false">
66
+
<slot name="title"></slot>
67
+
</div>
68
+
<div class="title-bar-controls">
69
+
<!--<button aria-label="Minimize"></button>-->
70
+
<!--<button aria-label="Maximize"></button>-->
71
+
<button aria-label="Close" @click="${() => this.removeAttribute("open")}"></button>
72
+
</div>
73
+
</div>
74
+
<div class="window-body">
75
+
<slot></slot>
76
+
</div>
77
+
</div>
78
+
</dialog>
79
+
`;
80
+
}
81
+
// EVENTS
82
+
/**
83
+
* @param {MouseEvent} mouse
84
+
*/
85
+
titleBarMouseDown(mouse) {
86
+
const event = new CustomEvent("dtw-window-start-move", {
87
+
bubbles: true,
88
+
composed: true,
89
+
detail: {
90
+
x: mouse.x,
91
+
xElement: mouse.layerX,
92
+
y: mouse.y,
93
+
yElement: mouse.layerY
94
+
}
95
+
});
96
+
this.dispatchEvent(event);
97
+
}
98
+
};
99
+
__name(_WindowElement, "WindowElement");
100
+
__publicField(_WindowElement, "observedAttributes", ["open"]);
101
+
var WindowElement = _WindowElement;
102
+
var element_default = WindowElement;
103
+
var CLASS = WindowElement;
104
+
var NAME = "dtw-window";
105
+
customElements.define(NAME, WindowElement);
106
+
107
+
export {
108
+
element_default,
109
+
CLASS,
110
+
NAME
111
+
};
112
+
113
+
//# sourceMappingURL=./chunk-K5J7GJD6.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-K5J7GJD6.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-K5J7GJD6.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 {\n min-width: 240px;\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}\"\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\">\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 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":";;;;;;;;;AAUA,IAAM,iBAAN,MAAM,uBAAsB,eAAe;AAAA,EAGzC,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,uBA4BY,KAAK,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA,0BAItB,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mDAWG,MACnC,KAAK,gBAAgB,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS1C;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,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;AApG2C;AACzC,cADI,gBACG,sBAAqB,CAAC,MAAM;AADrC,IAAM,gBAAN;AAsGA,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-K5J7GJD6.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-LGHY5MKC.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-LGHY5MKC.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-LGHY5MKC.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-LGHY5MKC.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-LGHY5MKC.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-LGHY5MKC.js.map
+54
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-M4KBNR7K.js
+54
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-M4KBNR7K.js
···
1
+
import {
2
+
outputManager
3
+
} from "./chunk-QQLIOIYP.js";
4
+
import {
5
+
DiffuseElement
6
+
} from "./chunk-GULCWZMN.js";
7
+
import {
8
+
use
9
+
} from "./chunk-SR6AOZ6U.js";
10
+
import {
11
+
__export,
12
+
__name
13
+
} from "./chunk-B2VGR7JE.js";
14
+
15
+
// components/output/polymorphic/indexed-db/element.js
16
+
var element_exports = {};
17
+
__export(element_exports, {
18
+
CLASS: () => CLASS,
19
+
NAME: () => NAME,
20
+
default: () => element_default
21
+
});
22
+
var _IndexedDBOutput = class _IndexedDBOutput extends DiffuseElement {
23
+
constructor() {
24
+
super();
25
+
const name = `diffuse/output/polymorphic/indexed-db/${this.group}`;
26
+
const url = import.meta.resolve(
27
+
"./components/output/polymorphic/indexed-db/worker.js"
28
+
);
29
+
const worker = new Worker(url, { name, type: "module" });
30
+
const manager = outputManager({
31
+
tracks: {
32
+
empty: /* @__PURE__ */ __name(() => [], "empty"),
33
+
get: use("getTracks", worker),
34
+
put: use("putTracks", worker)
35
+
}
36
+
});
37
+
this.tracks = manager.tracks;
38
+
}
39
+
};
40
+
__name(_IndexedDBOutput, "IndexedDBOutput");
41
+
var IndexedDBOutput = _IndexedDBOutput;
42
+
var element_default = IndexedDBOutput;
43
+
var CLASS = IndexedDBOutput;
44
+
var NAME = "dop-indexed-db";
45
+
customElements.define(NAME, IndexedDBOutput);
46
+
47
+
export {
48
+
element_default,
49
+
CLASS,
50
+
NAME,
51
+
element_exports
52
+
};
53
+
54
+
//# sourceMappingURL=./chunk-M4KBNR7K.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-M4KBNR7K.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-M4KBNR7K.js.map
···
1
+
{"version":3,"sources":["/components/output/polymorphic/indexed-db/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\nimport { use } from \"@common/worker.js\";\nimport { outputManager } from \"../../common.js\";\n\n/**\n * @import {OutputManager} from \"../../types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {OutputManager<any>}\n */\nclass IndexedDBOutput extends DiffuseElement {\n constructor() {\n super();\n\n // Setup worker\n const name = `diffuse/output/polymorphic/indexed-db/${this.group}`;\n const url = import.meta.resolve(\n \"./components/output/polymorphic/indexed-db/worker.js\",\n );\n\n const worker = new Worker(url, { name, type: \"module\" });\n\n // Manager\n const manager = outputManager({\n tracks: {\n empty: () => [],\n get: use(\"getTracks\", worker),\n put: use(\"putTracks\", worker),\n },\n });\n\n this.tracks = manager.tracks;\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":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,IAAM,mBAAN,MAAM,yBAAwB,eAAe;AAAA,EAC3C,cAAc;AACZ,UAAM;AAGN,UAAM,OAAO,yCAAyC,KAAK,KAAK;AAChE,UAAM,MAAM,YAAY;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,OAAO,KAAK,EAAE,MAAM,MAAM,SAAS,CAAC;AAGvD,UAAM,UAAU,cAAc;AAAA,MAC5B,QAAQ;AAAA,QACN,OAAO,6BAAM,CAAC,GAAP;AAAA,QACP,KAAK,IAAI,aAAa,MAAM;AAAA,QAC5B,KAAK,IAAI,aAAa,MAAM;AAAA,MAC9B;AAAA,IACF,CAAC;AAED,SAAK,SAAS,QAAQ;AAAA,EACxB;AACF;AAvB6C;AAA7C,IAAM,kBAAN;AAyBA,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-M4KBNR7K.js.map"}
+153
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-NCPT4TRJ.js
+153
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-NCPT4TRJ.js
···
1
+
import {
2
+
DiffuseElement,
3
+
query
4
+
} from "./chunk-GULCWZMN.js";
5
+
import {
6
+
__name
7
+
} from "./chunk-B2VGR7JE.js";
8
+
9
+
// themes/webamp/browser/element.js
10
+
var _Browser = class _Browser extends DiffuseElement {
11
+
constructor() {
12
+
super();
13
+
this.attachShadow({ mode: "open" });
14
+
this.input = query(this, "input-selector");
15
+
this.output = query(this, "output-selector");
16
+
this.queue = query(this, "queue-selector");
17
+
}
18
+
// LIFECYCLE
19
+
/**
20
+
* @override
21
+
*/
22
+
connectedCallback() {
23
+
super.connectedCallback();
24
+
(async () => {
25
+
await customElements.whenDefined(this.input.localName);
26
+
await customElements.whenDefined(this.output.localName);
27
+
this.effect(() => {
28
+
this.forceRender();
29
+
});
30
+
})();
31
+
}
32
+
// EVENTS
33
+
/**
34
+
* @param {MouseEvent} event
35
+
*/
36
+
highlightTableEntry(event) {
37
+
if (event.target instanceof HTMLElement === false) return;
38
+
const tr = event.target.tagName === "TR" ? event.target : event.target.closest("tr");
39
+
if (!tr) return;
40
+
tr.parentElement?.querySelector("tr.highlighted")?.classList.remove(
41
+
"highlighted"
42
+
);
43
+
tr.classList.add("highlighted");
44
+
}
45
+
/**
46
+
* @param {Track} track
47
+
*/
48
+
playTrack(track) {
49
+
this.queue.add({
50
+
inFront: true,
51
+
tracks: [track]
52
+
});
53
+
}
54
+
// RENDER
55
+
/**
56
+
* @param {RenderArg} _
57
+
*/
58
+
render({ html }) {
59
+
const tracks = this.output.tracks?.collection() || [];
60
+
return html`
61
+
<link rel="stylesheet" href="../../styles/vendor/98.css" />
62
+
63
+
<style>
64
+
@import "./98-vars.css";
65
+
66
+
/***********************************
67
+
* SEARCH
68
+
***********************************/
69
+
70
+
search {
71
+
margin-bottom: var(--grouped-button-spacing);
72
+
}
73
+
74
+
search input {
75
+
flex: 1;
76
+
}
77
+
78
+
/***********************************
79
+
* TABLE
80
+
***********************************/
81
+
82
+
.sunken-panel {
83
+
content-visibility: auto;
84
+
height: 30dvh;
85
+
min-height: 80px;
86
+
resize: both;
87
+
}
88
+
89
+
table {
90
+
color: var(--text-color);
91
+
table-layout: fixed;
92
+
width: 100%;
93
+
}
94
+
95
+
table th {
96
+
width: 30%;
97
+
98
+
&:first-child {
99
+
width: 40%;
100
+
}
101
+
}
102
+
103
+
table td {
104
+
contain-intrinsic-size: auto 14px;
105
+
overflow: hidden;
106
+
text-overflow: ellipsis;
107
+
}
108
+
</style>
109
+
110
+
<search class="field-row">
111
+
<label for="search-input">Search</label>
112
+
<input id="search-input" type="search" />
113
+
</search>
114
+
115
+
<div class="sunken-panel" style="width: 480px">
116
+
<table>
117
+
<thead>
118
+
<tr>
119
+
<th>Title</th>
120
+
<th>Artist</th>
121
+
<th>Album</th>
122
+
</tr>
123
+
</thead>
124
+
<tbody>
125
+
${tracks.map((track) => {
126
+
return html`
127
+
<tr @click="${this.highlightTableEntry}" @dblclick="${() => this.playTrack(track)}">
128
+
<td>${track.tags?.title}</td>
129
+
<td>${track.tags?.artist}</td>
130
+
<td>${track.tags?.album}</td>
131
+
</tr>
132
+
`;
133
+
})}
134
+
</tbody>
135
+
</table>
136
+
</div>
137
+
`;
138
+
}
139
+
};
140
+
__name(_Browser, "Browser");
141
+
var Browser = _Browser;
142
+
var element_default = Browser;
143
+
var CLASS = Browser;
144
+
var NAME = "dtw-browser";
145
+
customElements.define(NAME, Browser);
146
+
147
+
export {
148
+
element_default,
149
+
CLASS,
150
+
NAME
151
+
};
152
+
153
+
//# sourceMappingURL=./chunk-NCPT4TRJ.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-NCPT4TRJ.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-NCPT4TRJ.js.map
···
1
+
{"version":3,"sources":["/themes/webamp/browser/element.js"],"sourcesContent":["import { DiffuseElement, query } from \"@common/element.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {InputElement, Track} from \"@common/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n */\n\nclass Browser extends DiffuseElement {\n constructor() {\n super();\n\n // Enable Shadow DOM\n this.attachShadow({ mode: \"open\" });\n\n /** @type {InputElement} */\n this.input = query(this, \"input-selector\");\n\n /** @type {OutputElement<Track[]>} */\n this.output = query(this, \"output-selector\");\n\n /** @type {import(\"@components/engine/queue/element.js\").CLASS} */\n this.queue = query(this, \"queue-selector\");\n }\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n // Wait for the above dependencies to be defined, then render again.\n (async () => {\n await customElements.whenDefined(this.input.localName);\n await customElements.whenDefined(this.output.localName);\n\n this.effect(() => {\n this.forceRender();\n });\n })();\n }\n\n // EVENTS\n\n /**\n * @param {MouseEvent} event\n */\n highlightTableEntry(event) {\n if (event.target instanceof HTMLElement === false) return;\n\n const tr = event.target.tagName === \"TR\"\n ? event.target\n : event.target.closest(\"tr\");\n if (!tr) return;\n\n tr.parentElement?.querySelector(\"tr.highlighted\")?.classList.remove(\n \"highlighted\",\n );\n tr.classList.add(\"highlighted\");\n }\n\n /**\n * @param {Track} track\n */\n playTrack(track) {\n this.queue.add({\n inFront: true,\n tracks: [track],\n });\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n const tracks = this.output.tracks?.collection() || [];\n\n return html`\n <link rel=\"stylesheet\" href=\"../../styles/vendor/98.css\" />\n\n <style>\n @import \"./98-vars.css\";\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 /***********************************\n * TABLE\n ***********************************/\n\n .sunken-panel {\n content-visibility: auto;\n height: 30dvh;\n min-height: 80px;\n resize: both;\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 table td {\n contain-intrinsic-size: auto 14px;\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\" />\n </search>\n\n <div class=\"sunken-panel\" style=\"width: 480px\">\n <table>\n <thead>\n <tr>\n <th>Title</th>\n <th>Artist</th>\n <th>Album</th>\n </tr>\n </thead>\n <tbody>\n ${tracks.map((track) => {\n return html`\n <tr @click=\"${this.highlightTableEntry}\" @dblclick=\"${() =>\n this.playTrack(track)}\">\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 `;\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, Browser);\n"],"mappings":";;;;;;;;;AAQA,IAAM,WAAN,MAAM,iBAAgB,eAAe;AAAA,EACnC,cAAc;AACZ,UAAM;AAGN,SAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGlC,SAAK,QAAQ,MAAM,MAAM,gBAAgB;AAGzC,SAAK,SAAS,MAAM,MAAM,iBAAiB;AAG3C,SAAK,QAAQ,MAAM,MAAM,gBAAgB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB;AAClB,UAAM,kBAAkB;AAGxB,KAAC,YAAY;AACX,YAAM,eAAe,YAAY,KAAK,MAAM,SAAS;AACrD,YAAM,eAAe,YAAY,KAAK,OAAO,SAAS;AAEtD,WAAK,OAAO,MAAM;AAChB,aAAK,YAAY;AAAA,MACnB,CAAC;AAAA,IACH,GAAG;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB,OAAO;AACzB,QAAI,MAAM,kBAAkB,gBAAgB,MAAO;AAEnD,UAAM,KAAK,MAAM,OAAO,YAAY,OAChC,MAAM,SACN,MAAM,OAAO,QAAQ,IAAI;AAC7B,QAAI,CAAC,GAAI;AAET,OAAG,eAAe,cAAc,gBAAgB,GAAG,UAAU;AAAA,MAC3D;AAAA,IACF;AACA,OAAG,UAAU,IAAI,aAAa;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAO;AACf,SAAK,MAAM,IAAI;AAAA,MACb,SAAS;AAAA,MACT,QAAQ,CAAC,KAAK;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,EAAE,KAAK,GAAG;AACf,UAAM,SAAS,KAAK,OAAO,QAAQ,WAAW,KAAK,CAAC;AAEpD,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;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;AAAA;AAAA;AAAA;AAAA;AAAA,cAiEG,OAAO,IAAI,CAAC,UAAU;AACtB,aAAO;AAAA,8BACS,KAAK,mBAAmB,gBAAgB,MACpD,KAAK,UAAU,KAAK,CAAC;AAAA,wBACf,MAAM,MAAM,KAAK;AAAA,wBACjB,MAAM,MAAM,MAAM;AAAA,wBAClB,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA,IAG7B,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKZ;AACF;AAzJqC;AAArC,IAAM,UAAN;AA2JA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,OAAO;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-NCPT4TRJ.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-PGGLVZPS.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-PGGLVZPS.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-PGGLVZPS.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-PGGLVZPS.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-PGGLVZPS.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-PGGLVZPS.js.map
+112
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QL3YB5K6.js
+112
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QL3YB5K6.js
···
1
+
import {
2
+
__name
3
+
} from "./chunk-B2VGR7JE.js";
4
+
5
+
// ../node_modules/.deno/xxh32@2.0.5/node_modules/xxh32/dist/raw.js
6
+
var getUint32 = /* @__PURE__ */ __name((arr, i) => arr[i] | arr[i + 1 | 0] << 8 | arr[i + 2 | 0] << 16 | arr[i + 3 | 0] << 24, "getUint32");
7
+
var rotl32 = /* @__PURE__ */ __name((x, r) => x << r | x >>> 32 - r, "rotl32");
8
+
var xxh32r = /* @__PURE__ */ __name((buf, seed = 0) => {
9
+
seed |= 0;
10
+
const len = buf.length | 0;
11
+
let i = 0;
12
+
let h = (seed + len | 0) + 374761393 | 0;
13
+
if (len < 16) {
14
+
for (; (i + 3 | 0) < len; i = i + 4 | 0)
15
+
h = Math.imul(rotl32(h + Math.imul(getUint32(buf, i), 3266489917) | 0, 17), 668265263);
16
+
} else {
17
+
let v0 = seed + 606290984 | 0;
18
+
let v1 = seed + 2246822519 | 0;
19
+
let v2 = seed;
20
+
let v3 = seed - 2654435761 | 0;
21
+
if (len < 256) {
22
+
for (; (i + 15 | 0) < len; i = i + 16 | 0) {
23
+
v0 = Math.imul(rotl32(v0 + Math.imul(getUint32(buf, i + 0 | 0), 2246822519) | 0, 13), 2654435761);
24
+
v1 = Math.imul(rotl32(v1 + Math.imul(getUint32(buf, i + 4 | 0), 2246822519) | 0, 13), 2654435761);
25
+
v2 = Math.imul(rotl32(v2 + Math.imul(getUint32(buf, i + 8 | 0), 2246822519) | 0, 13), 2654435761);
26
+
v3 = Math.imul(rotl32(v3 + Math.imul(getUint32(buf, i + 12 | 0), 2246822519) | 0, 13), 2654435761);
27
+
}
28
+
h = (((rotl32(v0, 1) + rotl32(v1, 7) | 0) + rotl32(v2, 12) | 0) + rotl32(v3, 18) | 0) + len | 0;
29
+
for (; (i + 3 | 0) < len; i = i + 4 | 0)
30
+
h = Math.imul(rotl32(h + Math.imul(getUint32(buf, i), 3266489917) | 0, 17), 668265263);
31
+
} else {
32
+
const view = new DataView(buf.buffer);
33
+
for (; (i + 15 | 0) < len; i = i + 16 | 0) {
34
+
v0 = Math.imul(rotl32(v0 + Math.imul(view.getUint32(i + 0 | 0, true), 2246822519) | 0, 13), 2654435761);
35
+
v1 = Math.imul(rotl32(v1 + Math.imul(view.getUint32(i + 4 | 0, true), 2246822519) | 0, 13), 2654435761);
36
+
v2 = Math.imul(rotl32(v2 + Math.imul(view.getUint32(i + 8 | 0, true), 2246822519) | 0, 13), 2654435761);
37
+
v3 = Math.imul(rotl32(v3 + Math.imul(view.getUint32(i + 12 | 0, true), 2246822519) | 0, 13), 2654435761);
38
+
}
39
+
h = (((rotl32(v0, 1) + rotl32(v1, 7) | 0) + rotl32(v2, 12) | 0) + rotl32(v3, 18) | 0) + len | 0;
40
+
for (; (i + 3 | 0) < len; i = i + 4 | 0)
41
+
h = Math.imul(rotl32(h + Math.imul(view.getUint32(i, true), 3266489917) | 0, 17), 668265263);
42
+
}
43
+
}
44
+
for (; i < len; i = i + 1 | 0)
45
+
h = Math.imul(rotl32(h + Math.imul(buf[i], 374761393) | 0, 11), 2654435761);
46
+
h = Math.imul(h ^ h >>> 15, 2246822519);
47
+
h = Math.imul(h ^ h >>> 13, 3266489917);
48
+
return (h ^ h >>> 16) >>> 0;
49
+
}, "xxh32r");
50
+
51
+
// common/index.js
52
+
function arrayShuffle(array) {
53
+
if (array.length === 0) {
54
+
return [];
55
+
}
56
+
array = [...array];
57
+
for (let index = array.length - 1; index > 0; index--) {
58
+
const randArr = crypto.getRandomValues(new Uint32Array(1));
59
+
const randVal = randArr[0] / 2 ** 32;
60
+
const newIndex = Math.floor(randVal * (index + 1));
61
+
[array[index], array[newIndex]] = [array[newIndex], array[index]];
62
+
}
63
+
return array;
64
+
}
65
+
__name(arrayShuffle, "arrayShuffle");
66
+
function boolAttr(value) {
67
+
return value === "";
68
+
}
69
+
__name(boolAttr, "boolAttr");
70
+
function hash(object) {
71
+
return xxh32r(jsonEncode(object)).toString();
72
+
}
73
+
__name(hash, "hash");
74
+
function groupTracksPerScheme(tracks, initial = {}) {
75
+
const acc = initial;
76
+
tracks.forEach((track) => {
77
+
const scheme = track.uri.substring(0, track.uri.indexOf(":"));
78
+
acc[scheme] ??= [];
79
+
acc[scheme].push(track);
80
+
});
81
+
return acc;
82
+
}
83
+
__name(groupTracksPerScheme, "groupTracksPerScheme");
84
+
function isPrimitive(test) {
85
+
return test !== Object(test);
86
+
}
87
+
__name(isPrimitive, "isPrimitive");
88
+
function jsonDecode(a) {
89
+
return JSON.parse(new TextDecoder().decode(a));
90
+
}
91
+
__name(jsonDecode, "jsonDecode");
92
+
function jsonEncode(a) {
93
+
return new TextEncoder().encode(JSON.stringify(a));
94
+
}
95
+
__name(jsonEncode, "jsonEncode");
96
+
async function trackArtworkCacheId(track) {
97
+
return "";
98
+
}
99
+
__name(trackArtworkCacheId, "trackArtworkCacheId");
100
+
101
+
export {
102
+
arrayShuffle,
103
+
boolAttr,
104
+
hash,
105
+
groupTracksPerScheme,
106
+
isPrimitive,
107
+
jsonDecode,
108
+
jsonEncode,
109
+
trackArtworkCacheId
110
+
};
111
+
112
+
//# sourceMappingURL=./chunk-QL3YB5K6.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QL3YB5K6.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QL3YB5K6.js.map
···
1
+
{"version":3,"sources":["/node_modules/.deno/xxh32@2.0.5/node_modules/xxh32/dist/raw.js","/common/index.js"],"sourcesContent":["// src/raw.ts\nvar getUint32 = (arr, i) => arr[i] | arr[i + 1 | 0] << 8 | arr[i + 2 | 0] << 16 | arr[i + 3 | 0] << 24;\nvar rotl32 = (x, r) => x << r | x >>> 32 - r;\nvar xxh32r = (buf, seed = 0) => {\n seed |= 0;\n const len = buf.length | 0;\n let i = 0;\n let h = (seed + len | 0) + 374761393 | 0;\n if (len < 16) {\n for (; (i + 3 | 0) < len; i = i + 4 | 0)\n h = Math.imul(rotl32(h + Math.imul(getUint32(buf, i), 3266489917) | 0, 17), 668265263);\n } else {\n let v0 = seed + 606290984 | 0;\n let v1 = seed + 2246822519 | 0;\n let v2 = seed;\n let v3 = seed - 2654435761 | 0;\n if (len < 256) {\n for (; (i + 15 | 0) < len; i = i + 16 | 0) {\n v0 = Math.imul(rotl32(v0 + Math.imul(getUint32(buf, i + 0 | 0), 2246822519) | 0, 13), 2654435761);\n v1 = Math.imul(rotl32(v1 + Math.imul(getUint32(buf, i + 4 | 0), 2246822519) | 0, 13), 2654435761);\n v2 = Math.imul(rotl32(v2 + Math.imul(getUint32(buf, i + 8 | 0), 2246822519) | 0, 13), 2654435761);\n v3 = Math.imul(rotl32(v3 + Math.imul(getUint32(buf, i + 12 | 0), 2246822519) | 0, 13), 2654435761);\n }\n h = (((rotl32(v0, 1) + rotl32(v1, 7) | 0) + rotl32(v2, 12) | 0) + rotl32(v3, 18) | 0) + len | 0;\n for (; (i + 3 | 0) < len; i = i + 4 | 0)\n h = Math.imul(rotl32(h + Math.imul(getUint32(buf, i), 3266489917) | 0, 17), 668265263);\n } else {\n const view = new DataView(buf.buffer);\n for (; (i + 15 | 0) < len; i = i + 16 | 0) {\n v0 = Math.imul(rotl32(v0 + Math.imul(view.getUint32(i + 0 | 0, true), 2246822519) | 0, 13), 2654435761);\n v1 = Math.imul(rotl32(v1 + Math.imul(view.getUint32(i + 4 | 0, true), 2246822519) | 0, 13), 2654435761);\n v2 = Math.imul(rotl32(v2 + Math.imul(view.getUint32(i + 8 | 0, true), 2246822519) | 0, 13), 2654435761);\n v3 = Math.imul(rotl32(v3 + Math.imul(view.getUint32(i + 12 | 0, true), 2246822519) | 0, 13), 2654435761);\n }\n h = (((rotl32(v0, 1) + rotl32(v1, 7) | 0) + rotl32(v2, 12) | 0) + rotl32(v3, 18) | 0) + len | 0;\n for (; (i + 3 | 0) < len; i = i + 4 | 0)\n h = Math.imul(rotl32(h + Math.imul(view.getUint32(i, true), 3266489917) | 0, 17), 668265263);\n }\n }\n for (; i < len; i = i + 1 | 0)\n h = Math.imul(rotl32(h + Math.imul(buf[i], 374761393) | 0, 11), 2654435761);\n h = Math.imul(h ^ h >>> 15, 2246822519);\n h = Math.imul(h ^ h >>> 13, 3266489917);\n return (h ^ h >>> 16) >>> 0;\n};\nexport {\n xxh32r\n};\n","// import * as Uint8 from \"uint8arrays\";\nimport { xxh32r } from \"xxh32/dist/raw.js\";\n\n/**\n * @import {Track} from \"@common/types.d.ts\"\n */\n\n/**\n * @template T\n * @param {Array<T>} array\n * @returns Array<T>\n */\nexport function arrayShuffle(array) {\n if (array.length === 0) {\n return [];\n }\n\n array = [...array];\n\n for (let index = array.length - 1; index > 0; index--) {\n const randArr = crypto.getRandomValues(new Uint32Array(1));\n const randVal = randArr[0] / 2 ** 32;\n const newIndex = Math.floor(randVal * (index + 1));\n [array[index], array[newIndex]] = [array[newIndex], array[index]];\n }\n\n return array;\n}\n\n/**\n * @param {string | undefined | null} value\n */\nexport function boolAttr(value) {\n return value === \"\";\n}\n\n/**\n * @param {any} object\n */\nexport function hash(object) {\n return xxh32r(jsonEncode(object)).toString();\n}\n\n/**\n * @param {Track[]} tracks\n * @param {Record<string, Track[]>} initial\n * @returns {Record<string, Track[]>}\n */\nexport function groupTracksPerScheme(\n tracks,\n initial = {},\n) {\n /** @type {Record<string, Track[]>} */\n const acc = initial;\n\n tracks.forEach((track) => {\n const scheme = track.uri.substring(0, track.uri.indexOf(\":\"));\n acc[scheme] ??= [];\n acc[scheme].push(track);\n });\n\n return acc;\n}\n\n/**\n * @param {unknown} test\n */\nexport function isPrimitive(test) {\n return test !== Object(test);\n}\n\n/**\n * @template T\n * @param {any} a\n * @returns {T}\n */\nexport function jsonDecode(a) {\n return JSON.parse(new TextDecoder().decode(a));\n}\n\n/**\n * @template T\n * @param {T} a\n * @returns Uint8Array\n */\nexport function jsonEncode(a) {\n return new TextEncoder().encode(JSON.stringify(a));\n}\n\n/**\n * @param {Track} track\n * @returns {Promise<string>}\n */\nexport async function trackArtworkCacheId(track) {\n // TODO:\n return \"\";\n // return await crypto.subtle\n // .digest(\"SHA-256\", new TextEncoder().encode(track.uri))\n // .then((a) => Uint8.toString(new Uint8Array(a), \"base64url\"));\n}\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-QL3YB5K6.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QQLIOIYP.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QQLIOIYP.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-QQLIOIYP.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QQLIOIYP.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-QQLIOIYP.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-QQLIOIYP.js.map
+107
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-RMIZJ6MT.js
+107
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-RMIZJ6MT.js
···
1
+
import {
2
+
DiffuseElement,
3
+
query
4
+
} from "./chunk-GULCWZMN.js";
5
+
import {
6
+
getTransferables,
7
+
portProvider,
8
+
use
9
+
} from "./chunk-SR6AOZ6U.js";
10
+
import {
11
+
signal,
12
+
untracked
13
+
} from "./chunk-LGHY5MKC.js";
14
+
import {
15
+
__name,
16
+
__privateAdd,
17
+
__privateGet,
18
+
__privateSet,
19
+
__publicField
20
+
} from "./chunk-B2VGR7JE.js";
21
+
22
+
// components/orchestrator/process-tracks/element.js
23
+
var _external, _process, _isProcessing;
24
+
var _ProcessTracksOrchestrator = class _ProcessTracksOrchestrator extends DiffuseElement {
25
+
constructor() {
26
+
super();
27
+
__privateAdd(this, _external);
28
+
__privateAdd(this, _process);
29
+
// SIGNALS
30
+
__privateAdd(this, _isProcessing, signal(false));
31
+
// STATE
32
+
__publicField(this, "isProcessing", __privateGet(this, _isProcessing).get);
33
+
const name = `diffuse/orchestrator/process-tracks/${this.group}`;
34
+
const url = import.meta.resolve(
35
+
"./components/orchestrator/process-tracks/worker.js"
36
+
);
37
+
const worker = new Worker(url, { name, type: "module" });
38
+
this.input = query(this, "input-selector");
39
+
this.output = query(this, "output-selector");
40
+
this.metadataProcessor = query(this, "metadata-processor-selector");
41
+
__privateSet(this, _external, Promise.all([
42
+
customElements.whenDefined(this.input.localName),
43
+
customElements.whenDefined(this.metadataProcessor.localName)
44
+
]).then(() => ({
45
+
input: portProvider(this.input.worker()),
46
+
metadataProcessor: portProvider(this.metadataProcessor.worker())
47
+
})));
48
+
__privateSet(this, _process, use("process", worker, {
49
+
timeout: 6e4 * 60 * 2,
50
+
// 2 hours
51
+
transfer: getTransferables
52
+
}));
53
+
}
54
+
// LIFECYCLE
55
+
/**
56
+
* @override
57
+
*/
58
+
async connectedCallback() {
59
+
super.connectedCallback();
60
+
await customElements.whenDefined(this.output.localName);
61
+
this.effect(() => {
62
+
const state = this.output.tracks.state();
63
+
if (state !== "loaded") return;
64
+
untracked(() => this.process());
65
+
});
66
+
}
67
+
// ACTIONS
68
+
async process() {
69
+
const ext = await __privateGet(this, _external);
70
+
__privateGet(this, _isProcessing).value = true;
71
+
console.log("\u{1FAB5} Processing initiated");
72
+
const cachedTracks = this.output.tracks.collection();
73
+
const ports = {
74
+
input: ext.input(),
75
+
metadataProcessor: ext.metadataProcessor()
76
+
};
77
+
const result = await __privateGet(this, _process).call(this, {
78
+
ports: {
79
+
input: ports.input.port,
80
+
metadataProcessor: ports.metadataProcessor.port
81
+
},
82
+
tracks: cachedTracks
83
+
});
84
+
if (result) await this.output.tracks.save(result);
85
+
ports.input.disconnect();
86
+
ports.metadataProcessor.disconnect();
87
+
console.log("\u{1FAB5} Processing completed");
88
+
__privateGet(this, _isProcessing).value = false;
89
+
}
90
+
};
91
+
_external = new WeakMap();
92
+
_process = new WeakMap();
93
+
_isProcessing = new WeakMap();
94
+
__name(_ProcessTracksOrchestrator, "ProcessTracksOrchestrator");
95
+
var ProcessTracksOrchestrator = _ProcessTracksOrchestrator;
96
+
var element_default = ProcessTracksOrchestrator;
97
+
var CLASS = ProcessTracksOrchestrator;
98
+
var NAME = "do-process-tracks";
99
+
customElements.define(NAME, ProcessTracksOrchestrator);
100
+
101
+
export {
102
+
element_default,
103
+
CLASS,
104
+
NAME
105
+
};
106
+
107
+
//# sourceMappingURL=./chunk-RMIZJ6MT.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-RMIZJ6MT.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-RMIZJ6MT.js.map
···
1
+
{"version":3,"sources":["/components/orchestrator/process-tracks/element.js"],"sourcesContent":["import { DiffuseElement, query } from \"@common/element.js\";\nimport { signal, untracked } from \"@common/signal.js\";\nimport { getTransferables, portProvider, use } from \"@common/worker.js\";\n\n/**\n * @import {InputElement, Track} from \"@common/types.d.ts\"\n * @import {OutputElement} from \"@components/output/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 DiffuseElement {\n #external;\n #process;\n\n constructor() {\n super();\n\n // Setup worker\n const name = `diffuse/orchestrator/process-tracks/${this.group}`;\n const url = import.meta.resolve(\n \"./components/orchestrator/process-tracks/worker.js\",\n );\n\n const worker = new Worker(url, { name, type: \"module\" });\n\n /** @type {InputElement} */\n this.input = query(this, \"input-selector\");\n\n /** @type {OutputElement<Track[]>} */\n this.output = query(this, \"output-selector\");\n\n /** @type {import(\"@components/processor/metadata/element.js\").CLASS} */\n this.metadataProcessor = query(this, \"metadata-processor-selector\");\n\n // Create new workers specially for track processing\n this.#external = Promise.all([\n customElements.whenDefined(this.input.localName),\n customElements.whenDefined(this.metadataProcessor.localName),\n ]).then(() => ({\n input: portProvider(this.input.worker()),\n metadataProcessor: portProvider(this.metadataProcessor.worker()),\n }));\n\n // Worker proxy\n this.#process = use(\"process\", worker, {\n timeout: 60000 * 60 * 2, // 2 hours\n transfer: getTransferables,\n });\n }\n\n // SIGNALS\n\n #isProcessing = signal(false);\n\n // STATE\n\n isProcessing = this.#isProcessing.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\n\n // Wait until defined\n await customElements.whenDefined(this.output.localName);\n\n // Process whenever tracks are initially loaded\n this.effect(() => {\n const state = this.output.tracks.state();\n if (state !== \"loaded\") return;\n\n untracked(() => this.process());\n });\n }\n\n // ACTIONS\n\n async process() {\n const ext = await this.#external;\n\n // Start\n this.#isProcessing.value = true;\n console.log(\"🪵 Processing initiated\");\n\n const cachedTracks = this.output.tracks.collection();\n\n // Establish channel between external workers and our processing worker\n const ports = {\n input: ext.input(),\n metadataProcessor: ext.metadataProcessor(),\n };\n\n // Send everything to worker\n const result = await this.#process({\n ports: {\n input: ports.input.port,\n metadataProcessor: ports.metadataProcessor.port,\n },\n tracks: cachedTracks,\n });\n\n // Save if collection changed\n if (result) await this.output.tracks.save(result);\n\n // Close external channels\n ports.input.disconnect();\n ports.metadataProcessor.disconnect();\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":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAkBA,IAAM,6BAAN,MAAM,mCAAkC,eAAe;AAAA,EAIrD,cAAc;AACZ,UAAM;AAJR;AACA;AAwCA;AAAA,sCAAgB,OAAO,KAAK;AAI5B;AAAA,wCAAe,mBAAK,eAAc;AAtChC,UAAM,OAAO,uCAAuC,KAAK,KAAK;AAC9D,UAAM,MAAM,YAAY;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,OAAO,KAAK,EAAE,MAAM,MAAM,SAAS,CAAC;AAGvD,SAAK,QAAQ,MAAM,MAAM,gBAAgB;AAGzC,SAAK,SAAS,MAAM,MAAM,iBAAiB;AAG3C,SAAK,oBAAoB,MAAM,MAAM,6BAA6B;AAGlE,uBAAK,WAAY,QAAQ,IAAI;AAAA,MAC3B,eAAe,YAAY,KAAK,MAAM,SAAS;AAAA,MAC/C,eAAe,YAAY,KAAK,kBAAkB,SAAS;AAAA,IAC7D,CAAC,EAAE,KAAK,OAAO;AAAA,MACb,OAAO,aAAa,KAAK,MAAM,OAAO,CAAC;AAAA,MACvC,mBAAmB,aAAa,KAAK,kBAAkB,OAAO,CAAC;AAAA,IACjE,EAAE;AAGF,uBAAK,UAAW,IAAI,WAAW,QAAQ;AAAA,MACrC,SAAS,MAAQ,KAAK;AAAA;AAAA,MACtB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,oBAAoB;AACxB,UAAM,kBAAkB;AAGxB,UAAM,eAAe,YAAY,KAAK,OAAO,SAAS;AAGtD,SAAK,OAAO,MAAM;AAChB,YAAM,QAAQ,KAAK,OAAO,OAAO,MAAM;AACvC,UAAI,UAAU,SAAU;AAExB,gBAAU,MAAM,KAAK,QAAQ,CAAC;AAAA,IAChC,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,UAAU;AACd,UAAM,MAAM,MAAM,mBAAK;AAGvB,uBAAK,eAAc,QAAQ;AAC3B,YAAQ,IAAI,gCAAyB;AAErC,UAAM,eAAe,KAAK,OAAO,OAAO,WAAW;AAGnD,UAAM,QAAQ;AAAA,MACZ,OAAO,IAAI,MAAM;AAAA,MACjB,mBAAmB,IAAI,kBAAkB;AAAA,IAC3C;AAGA,UAAM,SAAS,MAAM,mBAAK,UAAL,WAAc;AAAA,MACjC,OAAO;AAAA,QACL,OAAO,MAAM,MAAM;AAAA,QACnB,mBAAmB,MAAM,kBAAkB;AAAA,MAC7C;AAAA,MACA,QAAQ;AAAA,IACV;AAGA,QAAI,OAAQ,OAAM,KAAK,OAAO,OAAO,KAAK,MAAM;AAGhD,UAAM,MAAM,WAAW;AACvB,UAAM,kBAAkB,WAAW;AAGnC,YAAQ,IAAI,gCAAyB;AACrC,uBAAK,eAAc,QAAQ;AAAA,EAC7B;AACF;AAxGE;AACA;AAwCA;AA1CqD;AAAvD,IAAM,4BAAN;AA2GA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,yBAAyB;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-RMIZJ6MT.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SPIQ6DSS.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SPIQ6DSS.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-SPIQ6DSS.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SPIQ6DSS.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SPIQ6DSS.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-SPIQ6DSS.js.map
+1028
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SR6AOZ6U.js
+1028
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SR6AOZ6U.js
···
1
+
import {
2
+
batch
3
+
} from "./chunk-LGHY5MKC.js";
4
+
import {
5
+
__name,
6
+
__privateAdd,
7
+
__privateGet,
8
+
__privateMethod,
9
+
__privateSet,
10
+
__privateWrapper
11
+
} from "./chunk-B2VGR7JE.js";
12
+
13
+
// https:https://jsr.io/@mary/ds-queue/0.1.3/lib/mod.ts
14
+
var _computedKey;
15
+
function createNode(value, next) {
16
+
return {
17
+
value,
18
+
next
19
+
};
20
+
}
21
+
__name(createNode, "createNode");
22
+
_computedKey = Symbol.iterator;
23
+
var _head, _tail, _size;
24
+
var _Queue = class _Queue {
25
+
constructor() {
26
+
__privateAdd(this, _head);
27
+
__privateAdd(this, _tail);
28
+
__privateAdd(this, _size, 0);
29
+
}
30
+
/** size of the queue */
31
+
get size() {
32
+
return __privateGet(this, _size);
33
+
}
34
+
/**
35
+
* clear the queue
36
+
*/
37
+
clear() {
38
+
__privateSet(this, _head, void 0);
39
+
__privateSet(this, _tail, void 0);
40
+
__privateSet(this, _size, 0);
41
+
}
42
+
/**
43
+
* adds a value to the end of the queue
44
+
* @param value value to add
45
+
* @returns the queue instance
46
+
*/
47
+
enqueue(value) {
48
+
const tail = __privateGet(this, _tail);
49
+
const node = createNode(value, void 0);
50
+
if (tail !== void 0) {
51
+
tail.next = node;
52
+
} else {
53
+
__privateSet(this, _head, node);
54
+
}
55
+
__privateSet(this, _tail, node);
56
+
__privateWrapper(this, _size)._++;
57
+
return this;
58
+
}
59
+
/**
60
+
* adds a value to the front of the queue
61
+
* @param value value to add
62
+
* @returns the queue instance
63
+
*/
64
+
enqueueFront(value) {
65
+
const head = __privateGet(this, _head);
66
+
const node = createNode(value, head);
67
+
if (head === void 0) {
68
+
__privateSet(this, _tail, node);
69
+
}
70
+
__privateSet(this, _head, node);
71
+
__privateWrapper(this, _size)._++;
72
+
return this;
73
+
}
74
+
/**
75
+
* removes the first value from the queue
76
+
* @returns first queued value, or undefined if empty
77
+
*/
78
+
dequeue() {
79
+
const head = __privateGet(this, _head);
80
+
if (!head) {
81
+
return;
82
+
}
83
+
const next = head.next;
84
+
__privateSet(this, _head, next);
85
+
if (next === void 0) {
86
+
__privateSet(this, _tail, void 0);
87
+
}
88
+
__privateWrapper(this, _size)._--;
89
+
return head.value;
90
+
}
91
+
/**
92
+
* get the first value without removing from queue
93
+
* @returns first queued value, or undefined if empty
94
+
*/
95
+
peek() {
96
+
return __privateGet(this, _head)?.value;
97
+
}
98
+
/**
99
+
* returns an iterator that drains all values from the queue
100
+
*/
101
+
drain() {
102
+
const self = this;
103
+
return {
104
+
next() {
105
+
const head = __privateGet(self, _head);
106
+
if (!head) {
107
+
return {
108
+
done: true,
109
+
value: void 0
110
+
};
111
+
}
112
+
const next = head.next;
113
+
__privateSet(self, _head, next);
114
+
if (next === void 0) {
115
+
__privateSet(self, _tail, void 0);
116
+
}
117
+
__privateWrapper(self, _size)._--;
118
+
return {
119
+
done: false,
120
+
value: head.value
121
+
};
122
+
},
123
+
[Symbol.iterator]() {
124
+
return this;
125
+
}
126
+
};
127
+
}
128
+
/**
129
+
* iterates over the queue without draining
130
+
*/
131
+
[_computedKey]() {
132
+
let current = __privateGet(this, _head);
133
+
return {
134
+
next() {
135
+
if (current === void 0) {
136
+
return {
137
+
done: true,
138
+
value: void 0
139
+
};
140
+
}
141
+
const value = current.value;
142
+
current = current.next;
143
+
return {
144
+
done: false,
145
+
value
146
+
};
147
+
}
148
+
};
149
+
}
150
+
};
151
+
_head = new WeakMap();
152
+
_tail = new WeakMap();
153
+
_size = new WeakMap();
154
+
__name(_Queue, "Queue");
155
+
var Queue = _Queue;
156
+
var mod_default = Queue;
157
+
158
+
// https:https://jsr.io/@okikio/transferables/1.0.2/src/mod.ts
159
+
var TypedArray = Object.getPrototypeOf(Int8Array);
160
+
var AudioData = globalThis.AudioData;
161
+
var ImageBitmap = globalThis.ImageBitmap;
162
+
var VideoFrame = globalThis.VideoFrame;
163
+
var OffscreenCanvas = globalThis.OffscreenCanvas;
164
+
var RTCDataChannel = globalThis.RTCDataChannel;
165
+
var MessageChannel2 = globalThis.MessageChannel;
166
+
var ReadableStream = globalThis.ReadableStream;
167
+
var WritableStream = globalThis.WritableStream;
168
+
var TransformStream = globalThis.TransformStream;
169
+
var ReadableStreamExists = "ReadableStream" in globalThis;
170
+
var WritableStreamExists = "WritableStream" in globalThis;
171
+
var TransformStreamExists = "TransformStream" in globalThis;
172
+
var StreamExists = ReadableStreamExists && WritableStreamExists && TransformStreamExists;
173
+
var MessageChannelExists = "MessageChannel" in globalThis;
174
+
var MessagePortExists = "MessagePort" in globalThis;
175
+
var ArrayBufferExists = "ArrayBuffer" in globalThis;
176
+
var AudioDataExists = "AudioData" in globalThis;
177
+
var ImageBitmapExists = "ImageBitmap" in globalThis;
178
+
var VideoFrameExists = "VideoFrame" in globalThis;
179
+
var OffscreenCanvasExists = "OffscreenCanvas" in globalThis;
180
+
var RTCDataChannelExists = "RTCDataChannel" in globalThis;
181
+
var structuredCloneExists = "structuredClone" in globalThis;
182
+
async function isSupported() {
183
+
async function getChannels() {
184
+
try {
185
+
if (!MessageChannelExists) return false;
186
+
const msgChanl = new MessageChannel2();
187
+
const obj = {
188
+
port1: msgChanl.port1
189
+
};
190
+
const clonedObj = structuredCloneExists ? structuredClone(obj, {
191
+
transfer: [
192
+
msgChanl.port1
193
+
]
194
+
}) : obj;
195
+
const messageChannel = new MessageChannel2();
196
+
const obj1 = {
197
+
port1: clonedObj.port1
198
+
};
199
+
await new Promise((resolve) => {
200
+
messageChannel.port1.postMessage(obj1, [
201
+
obj1.port1
202
+
]);
203
+
messageChannel.port1.onmessage = () => {
204
+
resolve();
205
+
};
206
+
messageChannel.port2.onmessage = ({ data }) => {
207
+
messageChannel.port2.postMessage(data, [
208
+
data.port1
209
+
]);
210
+
};
211
+
});
212
+
messageChannel.port1.close();
213
+
} catch (e) {
214
+
return false;
215
+
}
216
+
return true;
217
+
}
218
+
__name(getChannels, "getChannels");
219
+
;
220
+
async function getStreams() {
221
+
try {
222
+
if (!StreamExists) return false;
223
+
if (!MessageChannelExists && !structuredCloneExists) return false;
224
+
const streams2 = {
225
+
readonly: new ReadableStream(),
226
+
writeonly: new WritableStream(),
227
+
tranformonly: new TransformStream()
228
+
};
229
+
const clonedObj = structuredCloneExists ? structuredClone(streams2, {
230
+
transfer: [
231
+
streams2.readonly,
232
+
streams2.writeonly,
233
+
streams2.tranformonly
234
+
]
235
+
}) : streams2;
236
+
if (MessageChannelExists) {
237
+
const messageChannel = new MessageChannel2();
238
+
const streams1 = clonedObj;
239
+
await new Promise((resolve) => {
240
+
messageChannel.port1.postMessage(streams1, [
241
+
streams1.readonly,
242
+
streams1.writeonly,
243
+
streams1.tranformonly
244
+
]);
245
+
messageChannel.port1.onmessage = () => {
246
+
resolve();
247
+
};
248
+
messageChannel.port2.onmessage = ({ data }) => {
249
+
messageChannel.port2.postMessage(data, [
250
+
data.readonly,
251
+
data.writeonly,
252
+
data.tranformonly
253
+
].filter((x) => x !== void 0));
254
+
};
255
+
});
256
+
messageChannel.port1.close();
257
+
}
258
+
} catch (e) {
259
+
return false;
260
+
}
261
+
return true;
262
+
}
263
+
__name(getStreams, "getStreams");
264
+
;
265
+
const [channel, streams] = await Promise.all([
266
+
getChannels(),
267
+
getStreams()
268
+
]);
269
+
return {
270
+
channel,
271
+
streams
272
+
};
273
+
}
274
+
__name(isSupported, "isSupported");
275
+
function isObject(obj) {
276
+
return typeof obj === "object" && obj !== null || typeof obj === "function";
277
+
}
278
+
__name(isObject, "isObject");
279
+
function isTypedArray(obj) {
280
+
return ArrayBuffer.isView(obj);
281
+
}
282
+
__name(isTypedArray, "isTypedArray");
283
+
function isStream(obj) {
284
+
return ReadableStreamExists && obj instanceof ReadableStream || WritableStreamExists && obj instanceof WritableStream || TransformStreamExists && obj instanceof TransformStream;
285
+
}
286
+
__name(isStream, "isStream");
287
+
function isMessageChannel(obj) {
288
+
return MessageChannelExists && obj instanceof MessageChannel2;
289
+
}
290
+
__name(isMessageChannel, "isMessageChannel");
291
+
function isTransferable(obj) {
292
+
return ArrayBufferExists && obj instanceof ArrayBuffer || MessagePortExists && obj instanceof MessagePort || AudioDataExists && obj instanceof AudioData || ImageBitmapExists && obj instanceof ImageBitmap || VideoFrameExists && obj instanceof VideoFrame || OffscreenCanvasExists && obj instanceof OffscreenCanvas || RTCDataChannelExists && obj instanceof RTCDataChannel;
293
+
}
294
+
__name(isTransferable, "isTransferable");
295
+
function getTransferables(obj, streams = false, maxCount = 1e4) {
296
+
const result = /* @__PURE__ */ new Set([]);
297
+
const queues = [
298
+
[
299
+
obj
300
+
]
301
+
];
302
+
for (let i = 0; i < queues.length; i++) {
303
+
const queue = queues[i];
304
+
const len = queue.length;
305
+
for (let j = 0; j < len; j++) {
306
+
const item = queue[j];
307
+
if (isTypedArray(item)) {
308
+
result.add(item.buffer);
309
+
} else if (isTransferable(item) || streams && isStream(item)) {
310
+
result.add(item);
311
+
} else if (isMessageChannel(item)) {
312
+
result.add(item.port1);
313
+
result.add(item.port2);
314
+
} else if (!isStream(item) && isObject(item)) {
315
+
const values = Array.isArray(item) ? item : Object.values(item);
316
+
if (values.length) queues.push(values);
317
+
}
318
+
if (--maxCount <= 0) break;
319
+
}
320
+
}
321
+
return Array.from(result);
322
+
}
323
+
__name(getTransferables, "getTransferables");
324
+
325
+
// https:https://jsr.io/@mys/m-rpc/0.12.2/src/utils.ts
326
+
var transferableSupportFlags = isSupported();
327
+
async function getTransferables2(obj) {
328
+
const streamsFlag = (await transferableSupportFlags).streams;
329
+
return getTransferables(obj, streamsFlag);
330
+
}
331
+
__name(getTransferables2, "getTransferables");
332
+
function isMRpcCallMsg(val) {
333
+
return val?.type === "call";
334
+
}
335
+
__name(isMRpcCallMsg, "isMRpcCallMsg");
336
+
function isMRpcRetMsg(val) {
337
+
return val?.type === "ret";
338
+
}
339
+
__name(isMRpcRetMsg, "isMRpcRetMsg");
340
+
function jsonSerializer(msg) {
341
+
if ("err" in msg && msg.err instanceof Error) {
342
+
msg.err = msg.err.toString();
343
+
}
344
+
return JSON.stringify(msg);
345
+
}
346
+
__name(jsonSerializer, "jsonSerializer");
347
+
348
+
// https:https://jsr.io/@mys/m-rpc/0.12.2/src/ports.ts
349
+
function onMsg(port, listener) {
350
+
const evtName = "message";
351
+
if (isMessagePort(port) || isWorker(port) || isWorkerGlobalScope(port)) {
352
+
const l = /* @__PURE__ */ __name((e) => listener(e.data), "l");
353
+
port.addEventListener(evtName, l);
354
+
return () => port.removeEventListener(evtName, l);
355
+
} else if (isNodeWorkerOrNodeMessagePort(port)) {
356
+
const l = /* @__PURE__ */ __name((msg) => listener(msg), "l");
357
+
port.on(evtName, l);
358
+
return () => port.off(evtName, l);
359
+
} else if (isWebSocket(port)) {
360
+
const l = /* @__PURE__ */ __name((e) => listener(JSON.parse(e.data)), "l");
361
+
port.addEventListener(evtName, l);
362
+
return () => port.removeEventListener(evtName, l);
363
+
} else if (port instanceof MRpcCommonMsgPort) {
364
+
const l = /* @__PURE__ */ __name((e) => listener(port.deserializer(e.data)), "l");
365
+
port.addEventListener(evtName, l);
366
+
return () => port.removeEventListener(evtName, l);
367
+
} else {
368
+
throw new Error("Invalid port type.", {
369
+
cause: port
370
+
});
371
+
}
372
+
}
373
+
__name(onMsg, "onMsg");
374
+
async function sendMsg(options) {
375
+
const { port, msg, transfer: tf, nodeTransfer: ntf, ctx } = options;
376
+
if (isMessagePort(port) || isWorker(port) || isWorkerGlobalScope(port)) {
377
+
const transfer = !tf ? void 0 : tf === true ? await getTransferables2(ctx) : Array.isArray(tf) ? tf : ctx && tf(ctx);
378
+
port.postMessage(msg, {
379
+
transfer
380
+
});
381
+
} else if (isNodeWorkerOrNodeMessagePort(port)) {
382
+
const nodeTransfer = !ntf ? void 0 : Array.isArray(ntf) ? ntf : ctx && ntf(ctx);
383
+
port.postMessage(msg, nodeTransfer);
384
+
} else if (isWebSocket(port)) {
385
+
port.send(jsonSerializer(msg));
386
+
} else if (port instanceof MRpcCommonMsgPort) {
387
+
port.postMessage(port.serializer(msg));
388
+
} else {
389
+
throw new Error("Invalid port type.", {
390
+
cause: port
391
+
});
392
+
}
393
+
}
394
+
__name(sendMsg, "sendMsg");
395
+
var _MRpcCommonMsgPort = class _MRpcCommonMsgPort {
396
+
postMessage;
397
+
addEventListener;
398
+
removeEventListener;
399
+
serializer;
400
+
deserializer;
401
+
constructor(options) {
402
+
const { serializer = "json", deserializer = "json" } = options;
403
+
this.postMessage = options.postMessage;
404
+
this.addEventListener = options.addEventListener;
405
+
this.removeEventListener = options.removeEventListener;
406
+
this.serializer = serializer === "json" ? (data) => jsonSerializer(data) : serializer === "as-is" ? (data) => data : serializer;
407
+
this.deserializer = deserializer === "json" ? (data) => JSON.parse(data) : deserializer === "as-is" ? (data) => data : deserializer;
408
+
}
409
+
};
410
+
__name(_MRpcCommonMsgPort, "MRpcCommonMsgPort");
411
+
var MRpcCommonMsgPort = _MRpcCommonMsgPort;
412
+
function isMessagePort(port) {
413
+
return "MessagePort" in globalThis && port instanceof MessagePort && !("on" in port);
414
+
}
415
+
__name(isMessagePort, "isMessagePort");
416
+
function isWebSocket(port) {
417
+
return "WebSocket" in globalThis && port instanceof WebSocket;
418
+
}
419
+
__name(isWebSocket, "isWebSocket");
420
+
function isWorker(port) {
421
+
return "Worker" in globalThis && port instanceof Worker;
422
+
}
423
+
__name(isWorker, "isWorker");
424
+
function isWorkerGlobalScope(port) {
425
+
return port === globalThis;
426
+
}
427
+
__name(isWorkerGlobalScope, "isWorkerGlobalScope");
428
+
function isNodeWorkerOrNodeMessagePort(port) {
429
+
return "postMessage" in port && "on" in port && "off" in port;
430
+
}
431
+
__name(isNodeWorkerOrNodeMessagePort, "isNodeWorkerOrNodeMessagePort");
432
+
433
+
// https:https://jsr.io/@mys/m-rpc/0.12.2/src/mrpc.ts
434
+
var _NAMESPACE_DEFAULT, _NAMESPACE_INTERNAL, _ports, _port, _namespace, _callOptions, _defineOptions, _localFns, _remoteCalls, _onDisposedCallbacks, _callCnt, _disposed, _MRpc_instances, ensureInternalMRpc_fn, init_fn, startListening_fn, _MRpc_static, addPortNamespace_fn, deletePortNamespace_fn, ensurePortStates_fn;
435
+
var _MRpc = class _MRpc {
436
+
/* -------------------------------------------------- constructor -------------------------------------------------- */
437
+
constructor(port, options = {}) {
438
+
__privateAdd(this, _MRpc_instances);
439
+
__privateAdd(this, _port);
440
+
__privateAdd(this, _namespace);
441
+
__privateAdd(this, _callOptions);
442
+
__privateAdd(this, _defineOptions);
443
+
__privateAdd(this, _localFns, /* @__PURE__ */ new Map());
444
+
__privateAdd(this, _remoteCalls, /* @__PURE__ */ new Map());
445
+
__privateAdd(this, _onDisposedCallbacks, /* @__PURE__ */ new Set());
446
+
__privateAdd(this, _callCnt, 0);
447
+
__privateAdd(this, _disposed, false);
448
+
const { namespace = __privateGet(_MRpc, _NAMESPACE_DEFAULT), callOptions = {}, defineOptions = {} } = options;
449
+
__privateSet(this, _port, port);
450
+
__privateSet(this, _namespace, namespace);
451
+
__privateSet(this, _callOptions, callOptions);
452
+
__privateSet(this, _defineOptions, defineOptions);
453
+
__privateMethod(this, _MRpc_instances, init_fn).call(this);
454
+
}
455
+
get namespace() {
456
+
return __privateGet(this, _namespace);
457
+
}
458
+
get disposed() {
459
+
return __privateGet(this, _disposed);
460
+
}
461
+
/* -------------------------------------------------- public methods -------------------------------------------------- */
462
+
/**
463
+
* Define a local function.
464
+
*/
465
+
defineLocalFn(name, fn, options) {
466
+
const { transfer = false, nodeTransfer } = {
467
+
...__privateGet(this, _defineOptions),
468
+
...options
469
+
};
470
+
if (__privateGet(this, _localFns).has(name)) {
471
+
throw new Error(`The function name "${name}" has already been defined.`);
472
+
}
473
+
__privateGet(this, _localFns).set(name, {
474
+
fn,
475
+
transfer,
476
+
nodeTransfer
477
+
});
478
+
}
479
+
/**
480
+
* Define local functions.
481
+
*/
482
+
defineLocalFns(fns, options) {
483
+
for (const [name, fn] of Object.entries(fns)) {
484
+
this.defineLocalFn(name, fn, options?.[name]);
485
+
}
486
+
}
487
+
/**
488
+
* Call a remote function.
489
+
*/
490
+
callRemoteFn(name, args, options = {}) {
491
+
const { timeout = 3e3, retry = 0, transfer = false, nodeTransfer } = {
492
+
...__privateGet(this, _callOptions),
493
+
...options
494
+
};
495
+
const key = ++__privateWrapper(this, _callCnt)._;
496
+
const ret = new Promise((resolve, reject) => {
497
+
const timeoutId = setTimeout(() => {
498
+
__privateGet(this, _remoteCalls).delete(key);
499
+
if (retry > 0) {
500
+
this.callRemoteFn(name, args, {
501
+
...options,
502
+
retry: retry - 1
503
+
}).then(resolve, reject);
504
+
} else {
505
+
reject(new Error(`The call of the remote function "${name}" timed out.`));
506
+
}
507
+
}, timeout);
508
+
__privateGet(this, _remoteCalls).set(key, {
509
+
resolve: /* @__PURE__ */ __name((ret2) => {
510
+
clearTimeout(timeoutId);
511
+
resolve(ret2);
512
+
}, "resolve"),
513
+
reject: /* @__PURE__ */ __name((err) => {
514
+
clearTimeout(timeoutId);
515
+
reject(err);
516
+
}, "reject")
517
+
});
518
+
});
519
+
sendMsg({
520
+
port: __privateGet(this, _port),
521
+
msg: {
522
+
type: "call",
523
+
ns: __privateGet(this, _namespace),
524
+
key,
525
+
name,
526
+
args
527
+
},
528
+
ctx: {
529
+
args
530
+
},
531
+
transfer,
532
+
nodeTransfer
533
+
});
534
+
return ret;
535
+
}
536
+
/**
537
+
* Use a remote function.
538
+
*/
539
+
useRemoteFn(name, options) {
540
+
return (...args) => this.callRemoteFn(name, args, options);
541
+
}
542
+
/**
543
+
* Use remote functions.
544
+
*/
545
+
useRemoteFns(options) {
546
+
const fns = new Proxy({}, {
547
+
get: /* @__PURE__ */ __name((target, name) => {
548
+
if (typeof name !== "string") {
549
+
throw new Error(`The name is not a string.`, {
550
+
cause: name
551
+
});
552
+
}
553
+
if (target[name]) {
554
+
return target[name];
555
+
}
556
+
const fn = this.useRemoteFn(name, options?.[name]);
557
+
target[name] = fn;
558
+
return fn;
559
+
}, "get")
560
+
});
561
+
return fns;
562
+
}
563
+
/**
564
+
* Get the names of the local functions.
565
+
*/
566
+
getLocalFnNames() {
567
+
return Array.from(__privateGet(this, _localFns).keys());
568
+
}
569
+
/**
570
+
* Get the names of the remote functions.
571
+
*/
572
+
getRemoteFnNames() {
573
+
const internalMrpc = __privateMethod(this, _MRpc_instances, ensureInternalMRpc_fn).call(this);
574
+
return internalMrpc.callRemoteFn("$names", [
575
+
__privateGet(this, _namespace)
576
+
]);
577
+
}
578
+
/**
579
+
* Add an onDisposed callback.
580
+
*/
581
+
onDisposed(cb) {
582
+
__privateGet(this, _disposed) ? cb() : __privateGet(this, _onDisposedCallbacks).add(cb);
583
+
}
584
+
/**
585
+
* Dispose the MRpc instance. The port won't be stopped.
586
+
*/
587
+
dispose() {
588
+
var _a;
589
+
if (__privateGet(this, _disposed)) {
590
+
return;
591
+
}
592
+
__privateSet(this, _disposed, true);
593
+
__privateMethod(_a = _MRpc, _MRpc_static, deletePortNamespace_fn).call(_a, __privateGet(this, _port), __privateGet(this, _namespace));
594
+
for (const cb of __privateGet(this, _onDisposedCallbacks)) {
595
+
cb();
596
+
}
597
+
__privateGet(this, _onDisposedCallbacks).clear();
598
+
}
599
+
/* -------------------------------------------------- static methods -------------------------------------------------- */
600
+
static ensureMRpc(port, namespace = __privateGet(_MRpc, _NAMESPACE_DEFAULT)) {
601
+
return _MRpc.getMRpc(port, namespace) || new _MRpc(port, {
602
+
namespace
603
+
});
604
+
}
605
+
static getMRpc(port, namespace = __privateGet(_MRpc, _NAMESPACE_DEFAULT)) {
606
+
var _a;
607
+
return __privateMethod(_a = _MRpc, _MRpc_static, ensurePortStates_fn).call(_a, port).namespaces.get(namespace);
608
+
}
609
+
};
610
+
_NAMESPACE_DEFAULT = new WeakMap();
611
+
_NAMESPACE_INTERNAL = new WeakMap();
612
+
_ports = new WeakMap();
613
+
_port = new WeakMap();
614
+
_namespace = new WeakMap();
615
+
_callOptions = new WeakMap();
616
+
_defineOptions = new WeakMap();
617
+
_localFns = new WeakMap();
618
+
_remoteCalls = new WeakMap();
619
+
_onDisposedCallbacks = new WeakMap();
620
+
_callCnt = new WeakMap();
621
+
_disposed = new WeakMap();
622
+
_MRpc_instances = new WeakSet();
623
+
/* -------------------------------------------------- private methods -------------------------------------------------- */
624
+
ensureInternalMRpc_fn = /* @__PURE__ */ __name(function() {
625
+
return _MRpc.ensureMRpc(__privateGet(this, _port), __privateGet(_MRpc, _NAMESPACE_INTERNAL));
626
+
}, "#ensureInternalMRpc");
627
+
init_fn = /* @__PURE__ */ __name(function() {
628
+
var _a;
629
+
__privateMethod(_a = _MRpc, _MRpc_static, addPortNamespace_fn).call(_a, __privateGet(this, _port), __privateGet(this, _namespace), this);
630
+
__privateMethod(this, _MRpc_instances, ensureInternalMRpc_fn).call(this);
631
+
if (__privateGet(this, _namespace) === __privateGet(_MRpc, _NAMESPACE_INTERNAL)) {
632
+
const internalFns = {
633
+
$names: /* @__PURE__ */ __name((namespace) => _MRpc.getMRpc(__privateGet(this, _port), namespace)?.getLocalFnNames(), "$names")
634
+
};
635
+
this.defineLocalFns(internalFns);
636
+
}
637
+
__privateMethod(this, _MRpc_instances, startListening_fn).call(this);
638
+
}, "#init");
639
+
startListening_fn = /* @__PURE__ */ __name(function() {
640
+
const listener = /* @__PURE__ */ __name(async (msg) => {
641
+
if (isMRpcCallMsg(msg)) {
642
+
const { ns, name, key, args } = msg;
643
+
if (ns !== __privateGet(this, _namespace)) {
644
+
return;
645
+
}
646
+
const localFnInfo = __privateGet(this, _localFns).get(name);
647
+
if (!localFnInfo) {
648
+
sendMsg({
649
+
port: __privateGet(this, _port),
650
+
msg: {
651
+
type: "ret",
652
+
ns: __privateGet(this, _namespace),
653
+
name,
654
+
key,
655
+
err: new Error(`The function name "${name}" is not defined.`)
656
+
}
657
+
});
658
+
return;
659
+
}
660
+
const { fn, transfer, nodeTransfer } = localFnInfo;
661
+
try {
662
+
const ret = await fn(...args);
663
+
sendMsg({
664
+
port: __privateGet(this, _port),
665
+
msg: {
666
+
type: "ret",
667
+
ns: __privateGet(this, _namespace),
668
+
name,
669
+
key,
670
+
ret
671
+
},
672
+
ctx: {
673
+
ret
674
+
},
675
+
transfer,
676
+
nodeTransfer
677
+
});
678
+
} catch (err) {
679
+
sendMsg({
680
+
port: __privateGet(this, _port),
681
+
msg: {
682
+
type: "ret",
683
+
ns: __privateGet(this, _namespace),
684
+
name,
685
+
key,
686
+
err: err instanceof Error ? err : String(err)
687
+
}
688
+
});
689
+
}
690
+
} else if (isMRpcRetMsg(msg)) {
691
+
const { ns, name, key, ret, err } = msg;
692
+
if (ns !== __privateGet(this, _namespace)) {
693
+
return;
694
+
}
695
+
const remoteCallInfo = __privateGet(this, _remoteCalls).get(key);
696
+
if (!remoteCallInfo) {
697
+
return;
698
+
}
699
+
const { resolve, reject } = remoteCallInfo;
700
+
if (!err) {
701
+
resolve(ret);
702
+
} else {
703
+
reject(new Error(`The remote threw an error when calling the function "${name}".`, {
704
+
cause: err
705
+
}));
706
+
}
707
+
__privateGet(this, _remoteCalls).delete(key);
708
+
}
709
+
}, "listener");
710
+
const stop = onMsg(__privateGet(this, _port), listener);
711
+
this.onDisposed(() => {
712
+
stop();
713
+
});
714
+
}, "#startListening");
715
+
_MRpc_static = new WeakSet();
716
+
addPortNamespace_fn = /* @__PURE__ */ __name(function(port, namespace, mrpc) {
717
+
var _a;
718
+
const { namespaces } = __privateMethod(_a = _MRpc, _MRpc_static, ensurePortStates_fn).call(_a, port);
719
+
if (namespaces.has(namespace)) {
720
+
throw new Error(`The namespace "${namespace}" has already been used by another MRpc instance on this port.`);
721
+
}
722
+
namespaces.set(namespace, mrpc);
723
+
}, "#addPortNamespace");
724
+
deletePortNamespace_fn = /* @__PURE__ */ __name(function(port, namespace) {
725
+
var _a;
726
+
const { namespaces } = __privateMethod(_a = _MRpc, _MRpc_static, ensurePortStates_fn).call(_a, port);
727
+
namespaces.delete(namespace);
728
+
}, "#deletePortNamespace");
729
+
ensurePortStates_fn = /* @__PURE__ */ __name(function(port) {
730
+
let states = __privateGet(_MRpc, _ports).get(port);
731
+
if (!states) {
732
+
states = {
733
+
namespaces: /* @__PURE__ */ new Map()
734
+
};
735
+
__privateGet(_MRpc, _ports).set(port, states);
736
+
}
737
+
return states;
738
+
}, "#ensurePortStates");
739
+
__privateAdd(_MRpc, _MRpc_static);
740
+
__name(_MRpc, "MRpc");
741
+
/* -------------------------------------------------- properties -------------------------------------------------- */
742
+
__privateAdd(_MRpc, _NAMESPACE_DEFAULT, "0");
743
+
__privateAdd(_MRpc, _NAMESPACE_INTERNAL, "#");
744
+
__privateAdd(_MRpc, _ports, /* @__PURE__ */ new WeakMap());
745
+
var MRpc = _MRpc;
746
+
747
+
// https:https://jsr.io/@vicary/debounce-microtask/0.1.8/src/DebounceMicrotask.ts
748
+
var enqueue = typeof queueMicrotask === "function" ? queueMicrotask : (fn) => Promise.resolve().then(fn);
749
+
var debounceMicrotask = /* @__PURE__ */ __name((fn, options) => {
750
+
let queued = false;
751
+
let { debounceLimit = 1e3 } = options ?? {};
752
+
let currentArgs;
753
+
return (...args) => {
754
+
if (options?.updateArguments) {
755
+
currentArgs = args;
756
+
} else {
757
+
currentArgs ??= args;
758
+
}
759
+
if (queued) return;
760
+
if (debounceLimit-- <= 0) {
761
+
switch (options?.limitAction) {
762
+
case "ignore":
763
+
return;
764
+
case "invoke":
765
+
return fn(...currentArgs);
766
+
case "throw":
767
+
default:
768
+
throw new Error(`Maximum debounce limit reached.`);
769
+
}
770
+
}
771
+
queued = true;
772
+
enqueue(dequeue);
773
+
function dequeue() {
774
+
if (queued) {
775
+
queued = false;
776
+
enqueue(dequeue);
777
+
} else {
778
+
debounceLimit = options?.debounceLimit ?? 1e3;
779
+
fn(...currentArgs);
780
+
}
781
+
}
782
+
__name(dequeue, "dequeue");
783
+
};
784
+
}, "debounceMicrotask");
785
+
786
+
// ../node_modules/.deno/xxh32@2.0.5/node_modules/xxh32/dist/index.js
787
+
var encoder = new TextEncoder();
788
+
var bufferLength = 16384;
789
+
var buffer = new ArrayBuffer(bufferLength);
790
+
var uint8View = new Uint8Array(buffer);
791
+
var dataView = new DataView(buffer);
792
+
var rotl32 = /* @__PURE__ */ __name((x, r) => x << r | x >>> 32 - r, "rotl32");
793
+
var xxh32 = /* @__PURE__ */ __name((str, seed = 0) => {
794
+
const strLen = Math.imul(str.length, 3);
795
+
if (strLen > bufferLength) {
796
+
bufferLength = (strLen - 1 | 4095) + 1 | 0;
797
+
buffer = new ArrayBuffer(bufferLength);
798
+
uint8View = new Uint8Array(buffer);
799
+
dataView = new DataView(buffer);
800
+
}
801
+
seed |= 0;
802
+
const len = encoder.encodeInto(str, uint8View).written | 0;
803
+
let i = 0;
804
+
let h = (seed + len | 0) + 374761393 | 0;
805
+
if (len < 16) {
806
+
for (; (i + 3 | 0) < len; i = i + 4 | 0)
807
+
h = Math.imul(rotl32(h + Math.imul(dataView.getUint32(i, true), 3266489917) | 0, 17), 668265263);
808
+
} else {
809
+
let v0 = seed + 606290984 | 0;
810
+
let v1 = seed + 2246822519 | 0;
811
+
let v2 = seed;
812
+
let v3 = seed - 2654435761 | 0;
813
+
for (; (i + 15 | 0) < len; i = i + 16 | 0) {
814
+
v0 = Math.imul(rotl32(v0 + Math.imul(dataView.getUint32(i + 0 | 0, true), 2246822519) | 0, 13), 2654435761);
815
+
v1 = Math.imul(rotl32(v1 + Math.imul(dataView.getUint32(i + 4 | 0, true), 2246822519) | 0, 13), 2654435761);
816
+
v2 = Math.imul(rotl32(v2 + Math.imul(dataView.getUint32(i + 8 | 0, true), 2246822519) | 0, 13), 2654435761);
817
+
v3 = Math.imul(rotl32(v3 + Math.imul(dataView.getUint32(i + 12 | 0, true), 2246822519) | 0, 13), 2654435761);
818
+
}
819
+
h = (((rotl32(v0, 1) + rotl32(v1, 7) | 0) + rotl32(v2, 12) | 0) + rotl32(v3, 18) | 0) + len | 0;
820
+
for (; (i + 3 | 0) < len; i = i + 4 | 0)
821
+
h = Math.imul(rotl32(h + Math.imul(dataView.getUint32(i, true), 3266489917) | 0, 17), 668265263);
822
+
}
823
+
for (; i < len; i = i + 1 | 0)
824
+
h = Math.imul(rotl32(h + Math.imul(dataView.getUint8(i), 374761393) | 0, 11), 2654435761);
825
+
h = Math.imul(h ^ h >>> 15, 2246822519);
826
+
h = Math.imul(h ^ h >>> 13, 3266489917);
827
+
return (h ^ h >>> 16) >>> 0;
828
+
}, "xxh32");
829
+
830
+
// common/worker.js
831
+
function ostiary(callback, context = (
832
+
/** @type {T} */
833
+
/** @type {unknown} */
834
+
globalThis
835
+
)) {
836
+
if (
837
+
/** @type {any} */
838
+
context.onmessage === null
839
+
) {
840
+
return callback(context);
841
+
}
842
+
context.addEventListener(
843
+
"connect",
844
+
/**
845
+
* @param {any} event
846
+
*/
847
+
(event) => {
848
+
const port = event.ports[0];
849
+
port.start();
850
+
callback(port);
851
+
}
852
+
);
853
+
}
854
+
__name(ostiary, "ostiary");
855
+
function portProvider(workerOrPort) {
856
+
return () => {
857
+
const channel = new MessageChannel();
858
+
channel.port1.addEventListener("message", (event) => {
859
+
workerOrPort.postMessage(event.data);
860
+
});
861
+
const workerListener = /* @__PURE__ */ __name((event) => {
862
+
const msgEvent = (
863
+
/** @type {MessageEvent} */
864
+
event
865
+
);
866
+
channel.port1.postMessage(msgEvent.data);
867
+
}, "workerListener");
868
+
workerOrPort.addEventListener("message", workerListener);
869
+
channel.port1.start();
870
+
channel.port2.start();
871
+
return {
872
+
disconnect: /* @__PURE__ */ __name(() => {
873
+
workerOrPort.removeEventListener("message", workerListener);
874
+
channel.port1.close();
875
+
channel.port2.close();
876
+
}, "disconnect"),
877
+
port: channel.port2
878
+
};
879
+
};
880
+
}
881
+
__name(portProvider, "portProvider");
882
+
function proxyProvider(actions) {
883
+
return (workerOrPort) => {
884
+
const proxy = {};
885
+
actions.forEach((action) => {
886
+
proxy[action] = use(action.toString(), workerOrPort);
887
+
});
888
+
return (
889
+
/** @type {ProxiedActions<Actions>} */
890
+
proxy
891
+
);
892
+
};
893
+
}
894
+
__name(proxyProvider, "proxyProvider");
895
+
function announce(name, args, context) {
896
+
outgoing.enqueue(announcement(name, args));
897
+
flushOutgoingAnnouncements(context);
898
+
}
899
+
__name(announce, "announce");
900
+
function listen(name, fn, context = (
901
+
/** @type {WorkerGlobalScope} */
902
+
globalThis
903
+
)) {
904
+
const c = (
905
+
/** @type {any} */
906
+
context
907
+
);
908
+
if (!c.incoming) {
909
+
context.addEventListener("message", incomingAnnouncementsHandler(context));
910
+
c.incoming = {};
911
+
}
912
+
c.incoming[name] = debounceMicrotask(fn, { updateArguments: true });
913
+
}
914
+
__name(listen, "listen");
915
+
function define(name, fn, context = (
916
+
/** @type {WorkerGlobalScope} */
917
+
globalThis
918
+
)) {
919
+
const rpc = MRpc.ensureMRpc(context);
920
+
return rpc.defineLocalFn(name, fn);
921
+
}
922
+
__name(define, "define");
923
+
function use(name, context = (
924
+
/** @type {WorkerGlobalScope} */
925
+
globalThis
926
+
), options) {
927
+
const rpc = MRpc.ensureMRpc(context);
928
+
const _fn = rpc.useRemoteFn(name, { timeout: 6e4, ...options || {} });
929
+
const fn = (
930
+
/** @type {Fn} */
931
+
/* @__PURE__ */ __name((async (...args) => {
932
+
try {
933
+
return await _fn(...args);
934
+
} catch (err) {
935
+
if (err instanceof Error && err.message === `The remote threw an error when calling the function "${name}".`) {
936
+
err.message = `The worker function "${name}" throws an error.`;
937
+
}
938
+
throw err;
939
+
}
940
+
}), "fn")
941
+
);
942
+
return fn;
943
+
}
944
+
__name(use, "use");
945
+
var ANNOUNCEMENT = "announcement";
946
+
function announcement(name, args) {
947
+
return {
948
+
ns: ANNOUNCEMENT,
949
+
name,
950
+
key: xxh32(crypto.randomUUID()),
951
+
type: ANNOUNCEMENT,
952
+
args
953
+
};
954
+
}
955
+
__name(announcement, "announcement");
956
+
var flushIncomingAnnouncements = debounceMicrotask(
957
+
/**
958
+
* @param {MessagePort | Worker | WorkerGlobalScope} [context] Uses `globalThis` by default.
959
+
*/
960
+
(context = (
961
+
/** @type {WorkerGlobalScope} */
962
+
globalThis
963
+
)) => {
964
+
const arr = [];
965
+
for (const a of incoming.drain()) {
966
+
arr.push(a);
967
+
}
968
+
batch(() => {
969
+
const c = (
970
+
/** @type {any} */
971
+
context
972
+
);
973
+
arr.forEach((announcement2) => {
974
+
c.incoming[announcement2.name]?.(announcement2.args);
975
+
});
976
+
});
977
+
}
978
+
);
979
+
var flushOutgoingAnnouncements = debounceMicrotask(
980
+
/**
981
+
* @param {MessagePort | Worker | WorkerGlobalScope} [context] Uses `globalThis` by default.
982
+
*/
983
+
(context = (
984
+
/** @type {WorkerGlobalScope} */
985
+
globalThis
986
+
)) => {
987
+
const arr = [];
988
+
for (const a of outgoing.drain()) {
989
+
arr.push(a);
990
+
}
991
+
const transferables = getTransferables(arr);
992
+
context.postMessage(arr, { transfer: transferables });
993
+
}
994
+
);
995
+
var incoming = new mod_default();
996
+
function incomingAnnouncementsHandler(context) {
997
+
return (event) => {
998
+
const arr = (
999
+
/** @type {Announcement<any>[]} */
1000
+
event.data
1001
+
);
1002
+
if (Array.isArray(arr)) {
1003
+
arr.forEach((announcement2) => {
1004
+
const { ns, type } = announcement2;
1005
+
if (ns !== ANNOUNCEMENT || type !== ANNOUNCEMENT) return;
1006
+
incoming.enqueue(announcement2);
1007
+
flushIncomingAnnouncements(context);
1008
+
});
1009
+
}
1010
+
};
1011
+
}
1012
+
__name(incomingAnnouncementsHandler, "incomingAnnouncementsHandler");
1013
+
var outgoing = new mod_default();
1014
+
1015
+
export {
1016
+
getTransferables,
1017
+
debounceMicrotask,
1018
+
xxh32,
1019
+
ostiary,
1020
+
portProvider,
1021
+
proxyProvider,
1022
+
announce,
1023
+
listen,
1024
+
define,
1025
+
use
1026
+
};
1027
+
1028
+
//# sourceMappingURL=./chunk-SR6AOZ6U.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SR6AOZ6U.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-SR6AOZ6U.js.map
···
1
+
{"version":3,"sources":["https://jsr.io/@mary/ds-queue/0.1.3/lib/mod.ts","https://jsr.io/@okikio/transferables/1.0.2/src/mod.ts","https://jsr.io/@mys/m-rpc/0.12.2/src/utils.ts","https://jsr.io/@mys/m-rpc/0.12.2/src/ports.ts","https://jsr.io/@mys/m-rpc/0.12.2/src/mrpc.ts","https://jsr.io/@vicary/debounce-microtask/0.1.8/src/DebounceMicrotask.ts","/node_modules/.deno/xxh32@2.0.5/node_modules/xxh32/dist/index.js","/common/worker.js"],"sourcesContent":["interface Node<T> {\n\tvalue: T;\n\tnext: Node<T> | undefined;\n}\n\nfunction createNode<T>(value: T, next: Node<T> | undefined): Node<T> {\n\treturn { value, next };\n}\n\n/** a queue data structure (fifo) */\nclass Queue<T> implements Iterable<T> {\n\t#head: Node<T> | undefined;\n\t#tail: Node<T> | undefined;\n\t#size: number = 0;\n\n\t/** size of the queue */\n\tget size(): number {\n\t\treturn this.#size;\n\t}\n\n\t/**\n\t * clear the queue\n\t */\n\tclear(): void {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\t/**\n\t * adds a value to the end of the queue\n\t * @param value value to add\n\t * @returns the queue instance\n\t */\n\tenqueue(value: T): this {\n\t\tconst tail = this.#tail;\n\t\tconst node = createNode(value, undefined);\n\n\t\tif (tail !== undefined) {\n\t\t\ttail.next = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t}\n\n\t\tthis.#tail = node;\n\t\tthis.#size++;\n\t\treturn this;\n\t}\n\n\t/**\n\t * adds a value to the front of the queue\n\t * @param value value to add\n\t * @returns the queue instance\n\t */\n\tenqueueFront(value: T): this {\n\t\tconst head = this.#head;\n\t\tconst node = createNode(value, head);\n\n\t\tif (head === undefined) {\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#head = node;\n\t\tthis.#size++;\n\t\treturn this;\n\t}\n\n\t/**\n\t * removes the first value from the queue\n\t * @returns first queued value, or undefined if empty\n\t */\n\tdequeue(): T | undefined {\n\t\tconst head = this.#head;\n\t\tif (!head) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst next = head.next;\n\n\t\tthis.#head = next;\n\t\tif (next === undefined) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\tthis.#size--;\n\t\treturn head.value;\n\t}\n\n\t/**\n\t * get the first value without removing from queue\n\t * @returns first queued value, or undefined if empty\n\t */\n\tpeek(): T | undefined {\n\t\treturn this.#head?.value;\n\t}\n\n\t/**\n\t * returns an iterator that drains all values from the queue\n\t */\n\tdrain(): IterableIterator<T, undefined, undefined> {\n\t\t// deno-lint-ignore no-this-alias\n\t\tconst self = this;\n\n\t\treturn {\n\t\t\tnext() {\n\t\t\t\tconst head = self.#head;\n\t\t\t\tif (!head) {\n\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t}\n\n\t\t\t\tconst next = head.next;\n\n\t\t\t\tself.#head = next;\n\t\t\t\tif (next === undefined) {\n\t\t\t\t\tself.#tail = undefined;\n\t\t\t\t}\n\n\t\t\t\tself.#size--;\n\t\t\t\treturn { done: false, value: head.value };\n\t\t\t},\n\t\t\t[Symbol.iterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * iterates over the queue without draining\n\t */\n\t[Symbol.iterator](): Iterator<T, undefined, undefined> {\n\t\tlet current = this.#head;\n\n\t\treturn {\n\t\t\tnext() {\n\t\t\t\tif (current === undefined) {\n\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t}\n\n\t\t\t\tconst value = current.value;\n\t\t\t\tcurrent = current.next;\n\n\t\t\t\treturn { done: false, value: value };\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport default Queue;\n","/// <reference path=\"./types.d.ts\" />\n\n/**\n * Represents the prototype from which all typed arrays are derived. This can be used to check if an object is a typed array.\n * \n * @example\n * ```ts\n * const isTypedArray = (obj: any): obj is TypedArray => obj instanceof TypedArray;\n * console.log(isTypedArray(new Uint8Array(10))); // true\n * ```\n */\nexport const TypedArray: any = Object.getPrototypeOf(Int8Array);\n\n/**\n * Represents the AudioData interface from the Web Audio API, allowing manipulation of audio data directly.\n * \n * @example\n * ```ts\n * if (AudioData) {\n * console.log(\"AudioData is supported in this environment.\");\n * }\n * ```\n */\nexport const AudioData = globalThis.AudioData;\n\n/**\n * Represents the ImageBitmap interface, enabling manipulation of images in a way that is optimized for performance.\n * \n * @example\n * ```ts\n * createImageBitmap(blob).then((imageBitmap) => {\n * console.log(imageBitmap instanceof ImageBitmap); // true\n * });\n * ```\n */\nexport const ImageBitmap = globalThis.ImageBitmap;\n\n/**\n * Represents the VideoFrame interface, part of the WebCodecs API, allowing low-level manipulation of video frames.\n * \n * @example\n * ```ts\n * if (VideoFrame) {\n * console.log(\"VideoFrame is supported, can manipulate video frames directly.\");\n * }\n * ```\n */\nexport const VideoFrame = globalThis.VideoFrame;\n\n/**\n * Represents the OffscreenCanvas interface, enabling canvas rendering to be done off the main thread.\n * \n * @example\n * ```ts\n * if (OffscreenCanvas) {\n * const offscreen = new OffscreenCanvas(256, 256);\n * console.log(offscreen instanceof OffscreenCanvas); // true\n * }\n * ```\n */\nexport const OffscreenCanvas = globalThis.OffscreenCanvas;\n\n/**\n * Represents the RTCDataChannel interface, used for bidirectional peer-to-peer transfers of arbitrary data.\n * \n * @example\n * ```ts\n * const peerConnection = new RTCPeerConnection();\n * const dataChannel = peerConnection.createDataChannel(\"myLabel\");\n * console.log(dataChannel instanceof RTCDataChannel); // true\n * ```\n */\nexport const RTCDataChannel = globalThis.RTCDataChannel;\n\n/**\n * Represents the MessageChannel interface, providing a way to send data between different parts of your application.\n * \n * @example\n * ```ts\n * const channel = new MessageChannel();\n * channel.port1.onmessage = (event) => console.log(event.data);\n * channel.port2.postMessage(\"Hello, world!\");\n * ```\n */\nexport const MessageChannel = globalThis.MessageChannel;\n\n/**\n * Represents the ReadableStream interface, providing a way to handle streamed data read operations.\n */\nexport const ReadableStream = globalThis.ReadableStream;\n\n/**\n * Represents the WritableStream interface, providing a way to handle streamed data write operations.\n */\nexport const WritableStream = globalThis.WritableStream;\n\n/**\n * Represents the TransformStream interface, allowing data to be transformed as it is passed through the stream.\n */\nexport const TransformStream = globalThis.TransformStream;\n\nconst ReadableStreamExists = \"ReadableStream\" in globalThis;\nconst WritableStreamExists = \"WritableStream\" in globalThis;\nconst TransformStreamExists = \"TransformStream\" in globalThis;\n\nconst StreamExists = (\n ReadableStreamExists &&\n WritableStreamExists &&\n TransformStreamExists\n);\n\nconst MessageChannelExists = \"MessageChannel\" in globalThis;\nconst MessagePortExists = \"MessagePort\" in globalThis;\n\nconst ArrayBufferExists = \"ArrayBuffer\" in globalThis;\nconst AudioDataExists = \"AudioData\" in globalThis;\nconst ImageBitmapExists = \"ImageBitmap\" in globalThis;\nconst VideoFrameExists = \"VideoFrame\" in globalThis;\n\nconst OffscreenCanvasExists = \"OffscreenCanvas\" in globalThis;\nconst RTCDataChannelExists = \"RTCDataChannel\" in globalThis;\n\nconst TransferableExists = (\n ArrayBufferExists &&\n MessagePortExists &&\n AudioDataExists &&\n ImageBitmapExists &&\n VideoFrameExists &&\n OffscreenCanvasExists &&\n RTCDataChannelExists\n);\n\nconst structuredCloneExists = \"structuredClone\" in globalThis;\n\n/**\n * Summary of the available transferable objects in the current JavaScript runtime, useful for feature detection.\n * \n * @example\n * ```ts\n * if (AVAILABLE_TRANSFERABLE_OBJECTS.AudioDataExists) {\n * console.log(\"AudioData is available for use.\");\n * }\n * ```\n */\nexport const AVAILABLE_TRANSFERABLE_OBJECTS = {\n TransferableExists,\n StreamExists,\n\n ReadableStreamExists,\n WritableStreamExists,\n TransformStreamExists,\n\n MessageChannelExists,\n MessagePortExists,\n\n ArrayBufferExists,\n AudioDataExists,\n ImageBitmapExists,\n VideoFrameExists,\n OffscreenCanvasExists,\n RTCDataChannelExists,\n};\n\n/**\n * Type definition for all typed array variants, useful for type checking and TypeScript interfaces.\n * \n * @example\n * ```ts\n * function processTypedArray(typedArray: TypeTypedArray) {\n * console.log(typedArray.byteLength);\n * }\n * ```\n */\nexport type TypeTypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array;\n\n/**\n * Type definition for all transferable object types, supporting efficient data transfer operations.\n * \n * @example\n * ```ts\n * function transferObjects(transferable: TypeTransferable) {\n * postMessage(message, [transferable]);\n * }\n * ```\n */\nexport type TypeTransferable = ArrayBufferLike | ArrayBuffer | MessagePort | ReadableStream | WritableStream | TransformStream | AudioData | ImageBitmap | VideoFrame | OffscreenCanvas | RTCDataChannel;\n\n/**\n * Tests if certain transferable objects are actually supported in a specific js environment when using `structuredClone` and `MessageChannel postMessage`\n */\nexport async function isSupported(): Promise<{\n channel: boolean;\n streams: boolean;\n}> {\n async function getChannels() {\n try {\n if (!MessageChannelExists)\n return false;\n\n const msgChanl = new MessageChannel();\n const obj = { port1: msgChanl.port1 }\n const clonedObj = structuredCloneExists ? structuredClone(obj, {\n transfer: [\n msgChanl.port1,\n ]\n }) : obj;\n\n const messageChannel = new MessageChannel()\n const obj1 = { port1: clonedObj.port1 }\n await new Promise<void>(resolve => {\n messageChannel.port1.postMessage(obj1, [\n obj1.port1,\n ])\n messageChannel.port1.onmessage = () => {\n resolve()\n }\n messageChannel.port2.onmessage = ({ data }) => {\n messageChannel.port2.postMessage(data, [\n data.port1,\n ]);\n }\n })\n messageChannel.port1.close();\n } catch (e) {\n return false;\n }\n\n return true;\n };\n\n async function getStreams() {\n try {\n if (!StreamExists)\n return false;\n\n if (!MessageChannelExists && !structuredCloneExists)\n return false;\n\n const streams = {\n readonly: new ReadableStream(),\n writeonly: new WritableStream(),\n tranformonly: new TransformStream()\n }\n\n const clonedObj = structuredCloneExists ? structuredClone(streams, {\n transfer: [\n streams.readonly as unknown as Transferable,\n streams.writeonly as unknown as Transferable,\n streams.tranformonly as unknown as Transferable,\n ]\n }) : streams;\n\n if (MessageChannelExists) {\n const messageChannel = new MessageChannel()\n const streams1 = clonedObj;\n await new Promise<void>(resolve => {\n messageChannel.port1.postMessage(streams1, [\n streams1.readonly as unknown as Transferable,\n streams1.writeonly as unknown as Transferable,\n streams1.tranformonly as unknown as Transferable,\n ])\n messageChannel.port1.onmessage = () => {\n resolve();\n }\n messageChannel.port2.onmessage = ({ data }) => {\n messageChannel.port2.postMessage(data, [\n data.readonly as unknown as Transferable,\n data.writeonly as unknown as Transferable,\n data.tranformonly as unknown as Transferable,\n ].filter(x => x !== undefined));\n }\n })\n messageChannel.port1.close();\n }\n } catch (e) {\n return false;\n }\n\n return true;\n };\n\n const [channel, streams] = await Promise.all([getChannels(), getStreams()])\n return { channel, streams };\n}\n\n/**\n * Check if an object is an object or a function (because functions also count as objects)\n */\nexport function isObject(obj: unknown): obj is object | Function {\n return (typeof obj === \"object\" && obj !== null) || typeof obj === \"function\";\n}\n\n/**\n * Check if an object is an instanceof [TypedArray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) or [DataView](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)\n * \n * > `DataView` a lower level `TypedArray` which can function while ignoring the platforms inherent endianness. Read more on [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)\n */\nexport function isTypedArray(obj: unknown): obj is TypeTypedArray | DataView {\n return ArrayBuffer.isView(obj);\n}\n\n/**\n * Check's if an object is `ReadableStream`, `WritableStream` and/or `TransformStream`\n * \n * > Note: None of the stream API's are transferables in Safari 😥\n */\nexport function isStream(obj: unknown): obj is ReadableStream | WritableStream | TransformStream {\n return (\n (ReadableStreamExists && obj instanceof ReadableStream) ||\n (WritableStreamExists && obj instanceof WritableStream) ||\n (TransformStreamExists && obj instanceof TransformStream)\n );\n}\n\n/**\n * Check's if an object is `MessageChannel`\n */\nexport function isMessageChannel(obj: unknown): obj is MessageChannel {\n return (\n (MessageChannelExists && obj instanceof MessageChannel)\n );\n}\n\n/**\n * Check if an object is a supported transferable\n */\nexport function isTransferable(obj: unknown): obj is TypeTransferable {\n return (\n (ArrayBufferExists && obj instanceof ArrayBuffer) ||\n (MessagePortExists && obj instanceof MessagePort) ||\n (AudioDataExists && obj instanceof AudioData) ||\n (ImageBitmapExists && obj instanceof ImageBitmap) ||\n (VideoFrameExists && obj instanceof VideoFrame) ||\n (OffscreenCanvasExists && obj instanceof OffscreenCanvas) ||\n (RTCDataChannelExists && obj instanceof RTCDataChannel)\n );\n}\n\n/**\n * Filters out duplicate items\n */\nexport function filterOutDuplicates<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\n/**\n * Creates an array of transferable objects which exist in a given input, up to a max number of iterations\n * Thanks @aaorris for the help optimizing perf.\n * \n * @param obj Input object\n * @param streams Includes streams as transferable\n * @param maxCount Maximum number of iterations\n * @returns An array of transferable objects\n */\nexport function getTransferables(obj: unknown, streams = false, maxCount = 10_000): TypeTransferable[] {\n const result = new Set<TypeTransferable>([]);\n const queues = [[obj]];\n\n for (let i = 0; i < queues.length; i++) {\n const queue = queues[i];\n const len = queue.length;\n\n for (let j = 0; j < len; j++) {\n const item = queue[j];\n\n if (isTypedArray(item)) {\n result.add(item.buffer);\n } else if (isTransferable(item) || streams && isStream(item)) {\n result.add(item);\n } else if (isMessageChannel(item)) {\n result.add(item.port1);\n result.add(item.port2);\n }\n\n /** \n * Streams are circular objects, to avoid an infinite loop \n * we need to ensure that the object is not a stream \n */\n else if (!isStream(item) && isObject(item)) {\n const values = Array.isArray(item) ? item : Object.values(item);\n if (values.length) queues.push(values);\n }\n\n if (--maxCount <= 0) break;\n }\n }\n\n return Array.from(result);\n}\n\n/**\n * An iterator that contains the transferable objects from the input, up to a max number of iterations\n * Thanks @aaorris for the help optimizing perf.\n * \n * @param obj Input object\n * @param streams Includes streams as transferable\n * @param maxCount Maximum number of iterations\n * @returns Iterator that contains the transferable objects from the input\n */\nexport function* getTransferable(obj: unknown, streams = false, maxCount = 10_000): Generator<TypeTransferable | TypeTypedArray | MessageChannel | DataView> {\n const seen = new Set<TypeTransferable>([]);\n const queues = [[obj]];\n\n for (let i = 0; i < queues.length; i++) {\n const queue = queues[i];\n const len = queue.length;\n\n for (let j = 0; j < len; j++) {\n const item = queue[j];\n\n if (isTypedArray(item)) {\n const { buffer } = item;\n if (seen.has(buffer)) continue;\n\n yield buffer;\n seen.add(buffer);\n } else if (isTransferable(item) || streams && isStream(item)) {\n if (seen.has(item)) continue;\n\n yield item;\n seen.add(item);\n } else if (isMessageChannel(item)) {\n if (seen.has(item.port1) || seen.has(item.port2)) continue;\n\n yield item.port1;\n yield item.port2;\n\n seen.add(item.port1);\n seen.add(item.port2);\n }\n\n /** \n * Streams are circular objects, to avoid an infinite loop \n * we need to ensure that the object is not a stream \n */\n else if (!isStream(item) && isObject(item)) {\n const values = Array.isArray(item) ? item : Object.values(item);\n if (values.length) queues.push(values);\n }\n\n if (--maxCount <= 0) break;\n }\n }\n\n return null;\n}\n\n/**\n * Quickly checks to see if input contains at least one transferable object, up to a max number of iterations\n * Thanks @aaorris for the help optimizing perf.\n * \n * @param obj Input object\n * @param streams Includes streams as transferable\n * @param maxCount Maximum number of iterations\n * @returns Whether input object contains transferable objects\n */\nexport function hasTransferables(obj: unknown, streams = false, maxCount = 10_000): boolean {\n const queues = [[obj]];\n\n for (let i = 0; i < queues.length; i++) {\n const queue = queues[i];\n const len = queue.length;\n\n for (let j = 0; j < len; j++) {\n const item = queue[j];\n\n if (isTypedArray(item)) {\n return true;\n } else if (isTransferable(item) || (streams && isStream(item))) {\n return true;\n } else if (isMessageChannel(item)) {\n return true;\n }\n\n /** \n * Streams are circular objects, to avoid an infinite loop \n * we need to ensure that the object is not a stream \n */\n else if (!isStream(item) && isObject(item)) {\n const values = Array.isArray(item) ? item : Object.values(item);\n if (values.length) queues.push(values)\n }\n\n if (--maxCount <= 0) break;\n }\n }\n\n return false;\n}\n","import {\n getTransferables as _getTransferables,\n isSupported,\n} from \"jsr:@okikio/transferables@^1.0.2\";\nimport type { MRpcCallMsg, MRpcRetMsg } from \"./types.ts\";\n\n// Support flags for features like streams and channels,\n// we want to confirm if streams and channels are transferable\n// transferables aren't supported the same way across all browsers and runtimes,\n// in some runtimes it's more like partial support\nconst transferableSupportFlags = isSupported();\n\nexport async function getTransferables(obj: unknown) {\n const streamsFlag = (await transferableSupportFlags).streams;\n return _getTransferables(obj, streamsFlag) as Transferable[];\n}\n\nexport function isMRpcCallMsg(val: any): val is MRpcCallMsg {\n return val?.type === \"call\";\n}\n\nexport function isMRpcRetMsg(val: any): val is MRpcRetMsg {\n return val?.type === \"ret\";\n}\n\nexport function jsonSerializer(msg: any) {\n if (\"err\" in msg && msg.err instanceof Error) {\n msg.err = msg.err.toString();\n }\n return JSON.stringify(msg);\n}\n","import type {\n AnyFn,\n MRpcCallMsg,\n MRpcCallOptions,\n MRpcCommonMsgPortOptions,\n MRpcDefineOptions,\n MRpcMsgPort,\n MRpcRetMsg,\n NodeWorkerOrNodeMessagePort,\n WorkerGlobalScope,\n} from \"./types.ts\";\nimport { getTransferables, jsonSerializer } from \"./utils.ts\";\n\n/* -------------------------------------------------- MRpcMsgPort -------------------------------------------------- */\n\nexport function onMsg(\n port: MRpcMsgPort,\n listener: (msg: MRpcCallMsg | MRpcRetMsg) => void,\n): () => void {\n const evtName = \"message\";\n if (isMessagePort(port) || isWorker(port) || isWorkerGlobalScope(port)) {\n const l = (e: Event) => listener((e as MessageEvent).data);\n port.addEventListener(evtName, l);\n return () => port.removeEventListener(evtName, l);\n } else if (isNodeWorkerOrNodeMessagePort(port)) {\n const l = (msg: any) => listener(msg);\n port.on(evtName, l);\n return () => port.off(evtName, l);\n } else if (isWebSocket(port)) {\n const l = (e: MessageEvent) => listener(JSON.parse(e.data));\n port.addEventListener(evtName, l);\n return () => port.removeEventListener(evtName, l);\n } else if (port instanceof MRpcCommonMsgPort) {\n const l = (e: MessageEvent) => listener(port.deserializer(e.data));\n port.addEventListener(evtName, l);\n return () => port.removeEventListener(evtName, l);\n } else {\n throw new Error(\"Invalid port type.\", { cause: port });\n }\n}\n\nexport async function sendMsg<FN extends AnyFn = AnyFn>(\n options: {\n port: MRpcMsgPort;\n msg: MRpcRetMsg<FN>;\n ctx?: { ret: ReturnType<FN> };\n transfer?: MRpcDefineOptions<FN>[\"transfer\"];\n nodeTransfer?: MRpcDefineOptions<FN>[\"nodeTransfer\"];\n } | {\n port: MRpcMsgPort;\n msg: MRpcCallMsg<FN>;\n ctx?: { args: Parameters<FN> };\n transfer?: MRpcCallOptions<FN>[\"transfer\"];\n nodeTransfer?: MRpcCallOptions<FN>[\"nodeTransfer\"];\n },\n) {\n const { port, msg, transfer: tf, nodeTransfer: ntf, ctx } = options;\n\n if (isMessagePort(port) || isWorker(port) || isWorkerGlobalScope(port)) {\n const transfer = !tf\n ? undefined\n : tf === true\n ? (await getTransferables(ctx))\n : Array.isArray(tf)\n ? tf\n : ctx && tf(ctx as any);\n port.postMessage(msg, { transfer });\n } else if (isNodeWorkerOrNodeMessagePort(port)) {\n const nodeTransfer = !ntf\n ? undefined\n : Array.isArray(ntf)\n ? ntf\n : ctx && ntf(ctx as any);\n port.postMessage(msg, nodeTransfer);\n } else if (isWebSocket(port)) {\n port.send(jsonSerializer(msg));\n } else if (port instanceof MRpcCommonMsgPort) {\n port.postMessage(port.serializer(msg));\n } else {\n throw new Error(\"Invalid port type.\", { cause: port });\n }\n}\n\n/* -------------------------------------------------- MRpcCommonMsgPort -------------------------------------------------- */\n\nexport class MRpcCommonMsgPort {\n postMessage: MRpcCommonMsgPortOptions[\"postMessage\"];\n addEventListener: MRpcCommonMsgPortOptions[\"addEventListener\"];\n removeEventListener: MRpcCommonMsgPortOptions[\"removeEventListener\"];\n serializer: (data: any) => any;\n deserializer: (data: any) => any;\n\n constructor(options: MRpcCommonMsgPortOptions) {\n const {\n serializer = \"json\",\n deserializer = \"json\",\n } = options;\n\n this.postMessage = options.postMessage;\n this.addEventListener = options.addEventListener;\n this.removeEventListener = options.removeEventListener;\n\n this.serializer = serializer === \"json\"\n ? (data: any) => jsonSerializer(data)\n : serializer === \"as-is\"\n ? (data: any) => data\n : serializer;\n this.deserializer = deserializer === \"json\"\n ? (data: any) => JSON.parse(data)\n : deserializer === \"as-is\"\n ? (data: any) => data\n : deserializer;\n }\n}\n\n/* -------------------------------------------------- predicates -------------------------------------------------- */\n\nfunction isMessagePort(port: MRpcMsgPort): port is MessagePort {\n return \"MessagePort\" in globalThis && port instanceof MessagePort &&\n !(\"on\" in port);\n}\n\nfunction isWebSocket(port: MRpcMsgPort): port is WebSocket {\n return \"WebSocket\" in globalThis && port instanceof WebSocket;\n}\n\nfunction isWorker(port: MRpcMsgPort): port is Worker {\n return \"Worker\" in globalThis && port instanceof Worker;\n}\n\nfunction isWorkerGlobalScope(port: MRpcMsgPort): port is WorkerGlobalScope {\n return port as unknown === globalThis;\n}\n\nfunction isNodeWorkerOrNodeMessagePort(\n port: MRpcMsgPort,\n): port is NodeWorkerOrNodeMessagePort {\n return \"postMessage\" in port &&\n \"on\" in port &&\n \"off\" in port;\n}\n","import type {\n AnyFn,\n AwaitedRet,\n MRpcCallMsg,\n MRpcCallOptions,\n MRpcDefineOptions,\n MRpcMsgPort,\n MRpcOptions,\n MRpcRetMsg,\n RemoteFn,\n RemoteFns,\n RemoteRet,\n} from \"./types.ts\";\nimport { isMRpcCallMsg, isMRpcRetMsg } from \"./utils.ts\";\nimport { onMsg, sendMsg } from \"./ports.ts\";\n\n/* -------------------------------------------------- types -------------------------------------------------- */\n\ninterface LocalFnInfo {\n fn: AnyFn;\n transfer: MRpcDefineOptions[\"transfer\"];\n nodeTransfer: MRpcDefineOptions[\"nodeTransfer\"];\n}\n\ninterface RemoteCallInfo {\n resolve: (ret: any) => void;\n reject: (err: any) => void;\n}\n\ninterface PortStates {\n namespaces: Map<string, MRpc>; // namespace -> MRpc\n}\n\ntype InternalFns = {\n $names: (namespace: string) => string[] | undefined;\n};\n\n/* -------------------------------------------------- MRpc -------------------------------------------------- */\n\n/**\n * The agent for message based remote procedure calls.\n */\nexport class MRpc {\n /* -------------------------------------------------- properties -------------------------------------------------- */\n\n static #NAMESPACE_DEFAULT = \"0\";\n static #NAMESPACE_INTERNAL = \"#\";\n static #ports = new WeakMap<MRpcMsgPort, PortStates>();\n\n #port: MRpcMsgPort;\n #namespace: string;\n #callOptions: MRpcCallOptions;\n #defineOptions: MRpcDefineOptions;\n #localFns = new Map<string, LocalFnInfo>(); // name -> LocalFnInfo\n #remoteCalls = new Map<number, RemoteCallInfo>(); // key -> RemoteCallInfo\n #onDisposedCallbacks = new Set<() => void>();\n #callCnt = 0; // call counter\n #disposed = false;\n\n get namespace(): string {\n return this.#namespace;\n }\n\n get disposed(): boolean {\n return this.#disposed;\n }\n\n /* -------------------------------------------------- constructor -------------------------------------------------- */\n\n constructor(port: MRpcMsgPort, options: MRpcOptions = {}) {\n // options\n const {\n namespace = MRpc.#NAMESPACE_DEFAULT,\n callOptions = {},\n defineOptions = {},\n } = options;\n\n // init properties\n this.#port = port;\n this.#namespace = namespace;\n this.#callOptions = callOptions;\n this.#defineOptions = defineOptions;\n\n // init the instance\n this.#init();\n }\n\n /* -------------------------------------------------- public methods -------------------------------------------------- */\n\n /**\n * Define a local function.\n */\n defineLocalFn<FN extends AnyFn>(\n name: string,\n fn: FN,\n options?: MRpcDefineOptions<FN>,\n ): void {\n // options\n const {\n transfer = false,\n nodeTransfer,\n } = {\n ...this.#defineOptions,\n ...options,\n };\n\n // check if the function name has already been defined\n if (this.#localFns.has(name)) {\n throw new Error(`The function name \"${name}\" has already been defined.`);\n }\n\n // define the local function\n this.#localFns.set(name, { fn, transfer, nodeTransfer });\n }\n\n /**\n * Define local functions.\n */\n defineLocalFns<FNS extends Record<string, AnyFn>>(\n fns: FNS,\n options?: {\n [K in keyof FNS]?: MRpcDefineOptions<FNS[K]>;\n },\n ): void {\n for (const [name, fn] of Object.entries(fns)) {\n this.defineLocalFn(name, fn, options?.[name]);\n }\n }\n\n /**\n * Call a remote function.\n */\n callRemoteFn<FN extends AnyFn>(\n name: string,\n args: Parameters<FN>,\n options: MRpcCallOptions<FN> = {},\n ): RemoteRet<FN> {\n // options\n const {\n timeout = 3000,\n retry = 0,\n transfer = false,\n nodeTransfer,\n } = {\n ...this.#callOptions,\n ...options,\n };\n\n // generate a key for the call\n const key = ++this.#callCnt;\n\n // the return value of the remote function\n const ret = new Promise<AwaitedRet<FN>>((resolve, reject) => {\n // set a timeout\n const timeoutId = setTimeout(() => {\n // cleanup\n this.#remoteCalls.delete(key);\n // retry\n if (retry > 0) {\n this.callRemoteFn(name, args, {\n ...options,\n retry: retry - 1,\n }).then(resolve, reject);\n } else {\n reject(\n new Error(`The call of the remote function \"${name}\" timed out.`),\n );\n }\n }, timeout);\n // save the info of the call\n this.#remoteCalls.set(key, {\n resolve: (ret) => {\n clearTimeout(timeoutId);\n resolve(ret);\n },\n reject: (err) => {\n clearTimeout(timeoutId);\n reject(err);\n },\n });\n });\n\n // send a call message\n sendMsg({\n port: this.#port,\n msg: {\n type: \"call\",\n ns: this.#namespace,\n key,\n name,\n args,\n },\n ctx: { args },\n transfer,\n nodeTransfer,\n });\n\n // return a promise that resolves the return value of the remote function\n return ret;\n }\n\n /**\n * Use a remote function.\n */\n useRemoteFn<FN extends AnyFn>(\n name: string,\n options?: MRpcCallOptions<FN>,\n ): RemoteFn<FN> {\n return (...args: Parameters<FN>) => this.callRemoteFn(name, args, options);\n }\n\n /**\n * Use remote functions.\n */\n useRemoteFns<FNS extends Record<string, AnyFn>>(\n options?: {\n [K in keyof FNS]?: MRpcCallOptions<FNS[K]>;\n },\n ): RemoteFns<FNS> {\n const fns = new Proxy({} as RemoteFns<FNS>, {\n get: (target, name) => {\n if (typeof name !== \"string\") {\n throw new Error(`The name is not a string.`, { cause: name });\n }\n if (target[name]) {\n return target[name];\n }\n const fn = this.useRemoteFn(name, options?.[name]);\n (target as any)[name] = fn;\n return fn;\n },\n });\n return fns;\n }\n\n /**\n * Get the names of the local functions.\n */\n getLocalFnNames(): string[] {\n return Array.from(this.#localFns.keys());\n }\n\n /**\n * Get the names of the remote functions.\n */\n getRemoteFnNames(): Promise<string[] | undefined> {\n const internalMrpc = this.#ensureInternalMRpc();\n return internalMrpc.callRemoteFn<InternalFns[\"$names\"]>(\"$names\", [\n this.#namespace,\n ]);\n }\n\n /**\n * Add an onDisposed callback.\n */\n onDisposed(cb: () => void) {\n this.#disposed ? cb() : this.#onDisposedCallbacks.add(cb);\n }\n\n /**\n * Dispose the MRpc instance. The port won't be stopped.\n */\n dispose() {\n // check if already disposed\n if (this.#disposed) {\n return;\n }\n this.#disposed = true;\n\n // delete the namespace from the port\n MRpc.#deletePortNamespace(this.#port, this.#namespace);\n\n // call the onDisposed callbacks\n for (const cb of this.#onDisposedCallbacks) {\n cb();\n }\n\n // clear the onDisposed callbacks\n this.#onDisposedCallbacks.clear();\n }\n\n /* -------------------------------------------------- private methods -------------------------------------------------- */\n\n #ensureInternalMRpc() {\n return MRpc.ensureMRpc(this.#port, MRpc.#NAMESPACE_INTERNAL);\n }\n\n #init() {\n // add the namespace to the port\n MRpc.#addPortNamespace(this.#port, this.#namespace, this);\n\n // ensure internal MRpc\n this.#ensureInternalMRpc();\n\n // define internal functions if the namespace is internal\n if (this.#namespace === MRpc.#NAMESPACE_INTERNAL) {\n const internalFns: InternalFns = {\n $names: (namespace: string) =>\n MRpc.getMRpc(this.#port, namespace)?.getLocalFnNames(),\n };\n this.defineLocalFns(internalFns);\n }\n\n // start listening\n this.#startListening();\n }\n\n #startListening() {\n // the listener\n const listener = async (msg: MRpcCallMsg | MRpcRetMsg) => {\n if (isMRpcCallMsg(msg)) {\n // destructure the call message\n const { ns, name, key, args } = msg;\n\n // check the namespace\n if (ns !== this.#namespace) {\n return;\n }\n\n // get the local function\n const localFnInfo = this.#localFns.get(name);\n if (!localFnInfo) {\n sendMsg({\n port: this.#port,\n msg: {\n type: \"ret\",\n ns: this.#namespace,\n name,\n key,\n err: new Error(`The function name \"${name}\" is not defined.`),\n },\n });\n return;\n }\n\n // call the local function\n const { fn, transfer, nodeTransfer } = localFnInfo;\n try {\n const ret = await fn(...args);\n sendMsg({\n port: this.#port,\n msg: {\n type: \"ret\",\n ns: this.#namespace,\n name,\n key,\n ret,\n },\n ctx: { ret },\n transfer,\n nodeTransfer,\n });\n } catch (err) {\n sendMsg({\n port: this.#port,\n msg: {\n type: \"ret\",\n ns: this.#namespace,\n name,\n key,\n err: err instanceof Error ? err : String(err),\n },\n });\n }\n } else if (isMRpcRetMsg(msg)) {\n // destructure the return message\n const { ns, name, key, ret, err } = msg;\n\n // check the namespace\n if (ns !== this.#namespace) {\n return;\n }\n\n // get the promise resolvers\n const remoteCallInfo = this.#remoteCalls.get(key);\n if (!remoteCallInfo) {\n return;\n }\n\n // resolve the promise\n const { resolve, reject } = remoteCallInfo;\n if (!err) {\n resolve(ret);\n } else {\n reject(\n new Error(\n `The remote threw an error when calling the function \"${name}\".`,\n { cause: err },\n ),\n );\n }\n\n // cleanup\n this.#remoteCalls.delete(key);\n }\n };\n\n // start listening\n const stop = onMsg(this.#port, listener);\n\n // stop listening when disposed\n this.onDisposed(() => {\n stop();\n });\n }\n\n /* -------------------------------------------------- static methods -------------------------------------------------- */\n\n static ensureMRpc(\n port: MRpcMsgPort,\n namespace: string = MRpc.#NAMESPACE_DEFAULT,\n ): MRpc {\n return MRpc.getMRpc(port, namespace) || new MRpc(port, { namespace });\n }\n\n static getMRpc(\n port: MRpcMsgPort,\n namespace: string = MRpc.#NAMESPACE_DEFAULT,\n ): MRpc | undefined {\n return MRpc.#ensurePortStates(port).namespaces.get(namespace);\n }\n\n static #addPortNamespace(port: MRpcMsgPort, namespace: string, mrpc: MRpc) {\n const { namespaces } = MRpc.#ensurePortStates(port);\n if (namespaces.has(namespace)) {\n throw new Error(\n `The namespace \"${namespace}\" has already been used by another MRpc instance on this port.`,\n );\n }\n namespaces.set(namespace, mrpc);\n }\n\n static #deletePortNamespace(port: MRpcMsgPort, namespace: string) {\n const { namespaces } = MRpc.#ensurePortStates(port);\n namespaces.delete(namespace);\n }\n\n static #ensurePortStates(port: MRpcMsgPort): PortStates {\n let states = MRpc.#ports.get(port);\n if (!states) {\n states = {\n namespaces: new Map(),\n };\n MRpc.#ports.set(port, states);\n }\n return states;\n }\n}\n","/**\n * @module\n *\n * A simple utility to debounce a function to the next microtask.\n */\n\n/** A generic typed function. */\nexport type Function<TArgs extends unknown[], TReturn> = (\n ...args: TArgs\n) => TReturn;\n\nconst enqueue = typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : (fn: Function<unknown[], unknown>): unknown => Promise.resolve().then(fn);\n\n/**\n * Options for the debounceMicrotask function.\n */\nexport type Options = {\n /**\n * Maximum consecutive microtasks to push before bailing out for infinite\n * loops.\n *\n * @default 1000\n */\n debounceLimit?: number;\n\n /**\n * Actions to take when the debounce limit is reached.\n */\n limitAction?: \"ignore\" | \"invoke\" | \"throw\";\n\n /**\n * Enable this to update the arguments of the function to the latest\n * invocation, it uses the arguments from the first invocation by default.\n *\n * @default false\n */\n updateArguments?: boolean;\n};\n\n/**\n * Execute the function in the next microtask, if the function is called again\n * later in the event loop, push back the execution one more microtask\n * in the future.\n */\nexport const debounceMicrotask = <TArgs extends unknown[], TReturn>(\n fn: Function<TArgs, TReturn>,\n options?: Options,\n): Function<TArgs, void> => {\n let queued = false;\n let { debounceLimit = 1000 } = options ?? {};\n let currentArgs: TArgs | undefined;\n\n return (...args: TArgs) => {\n if (options?.updateArguments) {\n currentArgs = args;\n } else {\n currentArgs ??= args;\n }\n\n if (queued) return;\n\n if (debounceLimit-- <= 0) {\n switch (options?.limitAction) {\n case \"ignore\":\n return;\n case \"invoke\":\n return fn(...currentArgs!);\n case \"throw\":\n default:\n throw new Error(`Maximum debounce limit reached.`);\n }\n }\n\n queued = true;\n\n enqueue(dequeue);\n\n function dequeue() {\n if (queued) {\n queued = false;\n\n enqueue(dequeue);\n } else {\n debounceLimit = options?.debounceLimit ?? 1000;\n fn(...currentArgs!);\n }\n }\n };\n};\n","// src/index.ts\nvar encoder = new TextEncoder();\nvar bufferLength = 16384;\nvar buffer = new ArrayBuffer(bufferLength);\nvar uint8View = new Uint8Array(buffer);\nvar dataView = new DataView(buffer);\nvar rotl32 = (x, r) => x << r | x >>> 32 - r;\nvar xxh32 = (str, seed = 0) => {\n const strLen = Math.imul(str.length, 3);\n if (strLen > bufferLength) {\n bufferLength = (strLen - 1 | 4095) + 1 | 0;\n buffer = new ArrayBuffer(bufferLength);\n uint8View = new Uint8Array(buffer);\n dataView = new DataView(buffer);\n }\n seed |= 0;\n const len = encoder.encodeInto(str, uint8View).written | 0;\n let i = 0;\n let h = (seed + len | 0) + 374761393 | 0;\n if (len < 16) {\n for (; (i + 3 | 0) < len; i = i + 4 | 0)\n h = Math.imul(rotl32(h + Math.imul(dataView.getUint32(i, true), 3266489917) | 0, 17), 668265263);\n } else {\n let v0 = seed + 606290984 | 0;\n let v1 = seed + 2246822519 | 0;\n let v2 = seed;\n let v3 = seed - 2654435761 | 0;\n for (; (i + 15 | 0) < len; i = i + 16 | 0) {\n v0 = Math.imul(rotl32(v0 + Math.imul(dataView.getUint32(i + 0 | 0, true), 2246822519) | 0, 13), 2654435761);\n v1 = Math.imul(rotl32(v1 + Math.imul(dataView.getUint32(i + 4 | 0, true), 2246822519) | 0, 13), 2654435761);\n v2 = Math.imul(rotl32(v2 + Math.imul(dataView.getUint32(i + 8 | 0, true), 2246822519) | 0, 13), 2654435761);\n v3 = Math.imul(rotl32(v3 + Math.imul(dataView.getUint32(i + 12 | 0, true), 2246822519) | 0, 13), 2654435761);\n }\n h = (((rotl32(v0, 1) + rotl32(v1, 7) | 0) + rotl32(v2, 12) | 0) + rotl32(v3, 18) | 0) + len | 0;\n for (; (i + 3 | 0) < len; i = i + 4 | 0)\n h = Math.imul(rotl32(h + Math.imul(dataView.getUint32(i, true), 3266489917) | 0, 17), 668265263);\n }\n for (; i < len; i = i + 1 | 0)\n h = Math.imul(rotl32(h + Math.imul(dataView.getUint8(i), 374761393) | 0, 11), 2654435761);\n h = Math.imul(h ^ h >>> 15, 2246822519);\n h = Math.imul(h ^ h >>> 13, 3266489917);\n return (h ^ h >>> 16) >>> 0;\n};\nexport {\n xxh32\n};\n","import Queue from \"@mary/ds-queue\";\n\nimport { MRpc } from \"@mys/m-rpc\";\nimport { getTransferables } from \"@okikio/transferables\";\nimport { debounceMicrotask } from \"@vicary/debounce-microtask\";\nimport { xxh32 } from \"xxh32\";\n\nimport { batch } from \"./signal.js\";\n\nexport { getTransferables } from \"@okikio/transferables\";\n\n/**\n * @import {MRpcCallOptions, WorkerGlobalScope} from \"@mys/m-rpc\";\n *\n * @import {IncompleteArray} from \"./types.d.ts\"\n * @import {Announcement, ProxiedActions, ProxyProvider} from \"./worker.d.ts\"\n */\n\n////////////////////////////////////////////\n// MISC\n////////////////////////////////////////////\n\n/**\n * Manage incoming connections for a shared worker.\n * If a regular worker is used instead, it'll just execute the callback immediately.\n *\n * @template {MessagePort | Worker | WorkerGlobalScope} T\n * @param {(context: MessagePort | T) => void} callback\n * @param {T} [context] Uses `globalThis` by default.\n */\nexport function ostiary(\n callback,\n context = /** @type {T} */ (/** @type {unknown} */ (globalThis)),\n) {\n if (/** @type {any} */ (context).onmessage === null) {\n return callback(context);\n }\n\n context.addEventListener(\n \"connect\",\n /**\n * @param {any} event\n */\n (event) => {\n /** @type {MessagePort} */\n const port = event.ports[0];\n port.start();\n\n // Initiate setup\n callback(port);\n },\n );\n}\n\n/**\n * @param {MessagePort | Worker} workerOrPort\n */\nexport function portProvider(workerOrPort) {\n return () => {\n const channel = new MessageChannel();\n\n channel.port1.addEventListener(\"message\", (event) => {\n workerOrPort.postMessage(event.data);\n });\n\n /**\n * @param {Event} event\n */\n const workerListener = (event) => {\n const msgEvent = /** @type {MessageEvent} */ (event);\n channel.port1.postMessage(msgEvent.data);\n };\n\n workerOrPort.addEventListener(\"message\", workerListener);\n\n channel.port1.start();\n channel.port2.start();\n\n return {\n disconnect: () => {\n workerOrPort.removeEventListener(\"message\", workerListener);\n channel.port1.close();\n channel.port2.close();\n },\n port: channel.port2,\n };\n };\n}\n\n/**\n * @template {Record<string, (...args: any[]) => any>} Actions\n * @template {keyof Actions} T\n * @template {T[]} U\n * @param {U & ([T] extends [U[number]] ? unknown : IncompleteArray<T>[])} actions\n */\nexport function proxyProvider(actions) {\n /**\n * @type {ProxyProvider<Actions>}\n */\n return (workerOrPort) => {\n /** @type {Record<string | number | symbol, (...args: any[]) => any>} */\n const proxy = {};\n\n actions.forEach((action) => {\n proxy[action] = use(action.toString(), workerOrPort);\n });\n\n return /** @type {ProxiedActions<Actions>} */ (proxy);\n };\n}\n\n////////////////////////////////////////////\n// RAW\n////////////////////////////////////////////\n\n/**\n * @template T\n * @param {string} name\n * @param {T} args\n * @param {MessagePort | Worker | WorkerGlobalScope} [context] Uses `globalThis` by default.\n */\nexport function announce(\n name,\n args,\n context,\n) {\n outgoing.enqueue(announcement(name, args));\n flushOutgoingAnnouncements(context);\n}\n\n/**\n * @template T\n * @param {string} name\n * @param {(args: T) => void} fn\n * @param {MessagePort | Worker | WorkerGlobalScope} [context]\n */\nexport function listen(\n name,\n fn,\n context = /** @type {WorkerGlobalScope} */ (globalThis),\n) {\n const c = /** @type {any} */ (context);\n\n if (!c.incoming) {\n context.addEventListener(\"message\", incomingAnnouncementsHandler(context));\n c.incoming = {};\n }\n\n c.incoming[name] = debounceMicrotask(fn, { updateArguments: true });\n}\n\n////////////////////////////////////////////\n// RPC\n////////////////////////////////////////////\n\n/**\n * @template {(...args: any[]) => any} Fn\n * @param {string} name\n * @param {Fn} fn\n * @param {MessagePort | Worker | WorkerGlobalScope} [context] Uses `globalThis` by default.\n */\nexport function define(\n name,\n fn,\n context = /** @type {WorkerGlobalScope} */ (globalThis),\n) {\n const rpc = MRpc.ensureMRpc(context);\n return rpc.defineLocalFn(name, fn);\n}\n\n/**\n * @template {(...args: I[]) => O} Fn\n * @template I\n * @template O\n * @param {string} name\n * @param {MessagePort | Worker | WorkerGlobalScope} [context] Uses `globalThis` by default.\n * @param {MRpcCallOptions} [options]\n */\nexport function use(\n name,\n context = /** @type {WorkerGlobalScope} */ (globalThis),\n options,\n) {\n const rpc = MRpc.ensureMRpc(context);\n const _fn = rpc.useRemoteFn(name, { timeout: 60000, ...(options || {}) });\n\n const fn = /** @type {Fn} */ (async (...args) => {\n try {\n return await _fn(...args);\n } catch (err) {\n if (\n err instanceof Error &&\n err.message ===\n `The remote threw an error when calling the function \"${name}\".`\n ) {\n err.message = `The worker function \"${name}\" throws an error.`;\n }\n throw err;\n }\n });\n\n return fn;\n}\n\n////////////////////////////////////////////\n// ⛔️\n////////////////////////////////////////////\n\nconst ANNOUNCEMENT = \"announcement\";\n\n/**\n * @template T\n * @param {string} name\n * @param {T} args\n * @returns {Announcement<T>}\n */\nfunction announcement(name, args) {\n return {\n ns: ANNOUNCEMENT,\n name,\n key: xxh32(crypto.randomUUID()),\n\n type: ANNOUNCEMENT,\n args,\n };\n}\n\n/**\n * Process incoming announcements.\n */\nconst flushIncomingAnnouncements = debounceMicrotask(\n /**\n * @param {MessagePort | Worker | WorkerGlobalScope} [context] Uses `globalThis` by default.\n */\n (context = /** @type {WorkerGlobalScope} */ (globalThis)) => {\n /** @type {Announcement<any>[]} */\n const arr = [];\n\n for (const a of incoming.drain()) {\n arr.push(a);\n }\n\n batch(() => {\n const c = /** @type {any} */ (context);\n\n arr.forEach((announcement) => {\n c.incoming[announcement.name]?.(announcement.args);\n });\n });\n },\n);\n\n/**\n * Process outgoing announcements.\n */\nconst flushOutgoingAnnouncements = debounceMicrotask(\n /**\n * @param {MessagePort | Worker | WorkerGlobalScope} [context] Uses `globalThis` by default.\n */\n (context = /** @type {WorkerGlobalScope} */ (globalThis)) => {\n /** @type {Announcement<any>[]} */\n const arr = [];\n\n for (const a of outgoing.drain()) {\n arr.push(a);\n }\n\n const transferables = getTransferables(arr);\n context.postMessage(arr, { transfer: transferables });\n },\n);\n\n/**\n * @type {Queue<Announcement<any>>}\n */\nconst incoming = new Queue();\n\n/**\n * @param {MessagePort | Worker | WorkerGlobalScope} context\n */\nfunction incomingAnnouncementsHandler(context) {\n /** @param {any} event */\n return (event) => {\n const arr = /** @type {Announcement<any>[]} */ (event.data);\n\n if (Array.isArray(arr)) {\n arr.forEach((announcement) => {\n const { ns, type } = announcement;\n if (ns !== ANNOUNCEMENT || type !== ANNOUNCEMENT) return;\n incoming.enqueue(announcement);\n flushIncomingAnnouncements(context);\n });\n }\n };\n}\n\n/**\n * @type {Queue<Announcement<any>>}\n */\nconst outgoing = new Queue();\n"],"mappings":"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","names":["MessageChannel","MessageChannel","streams","getTransferables","getTransferables","ret","announcement"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-SR6AOZ6U.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-T3A2JWMA.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-T3A2JWMA.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-T3A2JWMA.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-T3A2JWMA.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-T3A2JWMA.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-T3A2JWMA.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-UULQAGTI.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-UULQAGTI.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-UULQAGTI.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-UULQAGTI.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-UULQAGTI.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-UULQAGTI.js.map
+159
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-VBPEFHHO.js
+159
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-VBPEFHHO.js
···
1
+
import {
2
+
DiffuseElement
3
+
} from "./chunk-GULCWZMN.js";
4
+
import {
5
+
debounceMicrotask
6
+
} from "./chunk-SR6AOZ6U.js";
7
+
import {
8
+
signal
9
+
} from "./chunk-LGHY5MKC.js";
10
+
import {
11
+
__name,
12
+
__privateAdd,
13
+
__privateGet,
14
+
__privateWrapper,
15
+
__publicField
16
+
} from "./chunk-B2VGR7JE.js";
17
+
18
+
// themes/webamp/window-manager/element.js
19
+
var _lastZindex;
20
+
var _WindowManager = class _WindowManager extends DiffuseElement {
21
+
constructor() {
22
+
super();
23
+
// SIGNALS
24
+
__publicField(this, "$activeWindow", signal(
25
+
/** @type {string | null} */
26
+
null
27
+
));
28
+
__privateAdd(this, _lastZindex, 1e3);
29
+
this.attachShadow({ mode: "open" });
30
+
}
31
+
// LIFECYCLE
32
+
/**
33
+
* @override
34
+
*/
35
+
connectedCallback() {
36
+
super.connectedCallback();
37
+
this.addEventListener("mousedown", this.focusOnWindow);
38
+
this.addEventListener("dtw-window-start-move", this.windowMoveStart);
39
+
document.body.addEventListener(
40
+
"mousedown",
41
+
this.bringWebampToFront.bind(this)
42
+
);
43
+
this.effect(() => {
44
+
const activeId = this.$activeWindow.value;
45
+
this.setWindowStatuses(activeId);
46
+
});
47
+
}
48
+
/**
49
+
* @override
50
+
*/
51
+
disconnectedCallback() {
52
+
super.disconnectedCallback();
53
+
this.removeEventListener("mousedown", this.focusOnWindow);
54
+
this.removeEventListener("dtw-window-start-move", this.windowMoveStart);
55
+
document.body.removeEventListener(
56
+
"mousedown",
57
+
this.bringWebampToFront.bind(this)
58
+
);
59
+
}
60
+
/**
61
+
* @param {MouseEvent} event
62
+
*/
63
+
bringWebampToFront(event) {
64
+
if (event.target instanceof HTMLElement) {
65
+
const webamp = event.target?.closest("#webamp");
66
+
if (webamp instanceof HTMLElement) {
67
+
__privateWrapper(this, _lastZindex)._++;
68
+
webamp.style.zIndex = __privateGet(this, _lastZindex).toString();
69
+
}
70
+
}
71
+
}
72
+
/**
73
+
* @param {Event} event
74
+
*/
75
+
focusOnWindow(event) {
76
+
if (event.target instanceof HTMLElement) {
77
+
const win = event.target?.closest("dtw-window");
78
+
if (win instanceof HTMLElement === false) return;
79
+
if (win.id) this.$activeWindow.value = win.id;
80
+
__privateWrapper(this, _lastZindex)._++;
81
+
win.style.zIndex = __privateGet(this, _lastZindex).toString();
82
+
}
83
+
}
84
+
/**
85
+
* @param {string | null} activeId
86
+
*/
87
+
async setWindowStatuses(activeId) {
88
+
await customElements.whenDefined("dtw-window");
89
+
this.querySelectorAll("dtw-window").forEach(
90
+
(window) => {
91
+
const win = (
92
+
/** @type {WindowElement} */
93
+
window
94
+
);
95
+
if (activeId && window.id === activeId) {
96
+
win.activate();
97
+
} else {
98
+
win.deactivate();
99
+
}
100
+
}
101
+
);
102
+
}
103
+
/**
104
+
* @param {any} ogEvent
105
+
*/
106
+
windowMoveStart(ogEvent) {
107
+
const moveFn = debounceMicrotask((event) => {
108
+
if (event instanceof MouseEvent) {
109
+
const x = event.x - ogEvent.detail.xElement;
110
+
const y = event.y - ogEvent.detail.yElement;
111
+
const target = ogEvent.target;
112
+
if (target) {
113
+
target.style.left = `${x}px`;
114
+
target.style.top = `${y}px`;
115
+
}
116
+
}
117
+
}, {
118
+
updateArguments: true
119
+
});
120
+
const stopMove = /* @__PURE__ */ __name(() => {
121
+
this.removeEventListener("mousemove", moveFn);
122
+
document.removeEventListener("mouseup", stopMove);
123
+
document.removeEventListener("mouseleave", stopMove);
124
+
}, "stopMove");
125
+
this.addEventListener("mousemove", moveFn);
126
+
document.addEventListener("mouseup", stopMove);
127
+
document.addEventListener("mouseleave", stopMove);
128
+
}
129
+
// RENDER
130
+
/**
131
+
* @param {RenderArg} _
132
+
*/
133
+
render({ html }) {
134
+
return html`
135
+
<style>
136
+
:host {
137
+
user-select: none;
138
+
}
139
+
</style>
140
+
141
+
<slot></slot>
142
+
`;
143
+
}
144
+
};
145
+
_lastZindex = new WeakMap();
146
+
__name(_WindowManager, "WindowManager");
147
+
var WindowManager = _WindowManager;
148
+
var element_default = WindowManager;
149
+
var CLASS = WindowManager;
150
+
var NAME = "dtw-window-manager";
151
+
customElements.define(NAME, WindowManager);
152
+
153
+
export {
154
+
element_default,
155
+
CLASS,
156
+
NAME
157
+
};
158
+
159
+
//# sourceMappingURL=./chunk-VBPEFHHO.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-VBPEFHHO.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-VBPEFHHO.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\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import WindowElement from \"../window/element.js\";\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass WindowManager extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n // SIGNALS\n\n $activeWindow = signal(/** @type {string | null} */ (null));\n #lastZindex = 1000;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n // Events\n this.addEventListener(\"mousedown\", this.focusOnWindow);\n this.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.removeEventListener(\"mousedown\", this.focusOnWindow);\n this.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\n this.querySelectorAll(\"dtw-window\").forEach(\n (window) => {\n const win = /** @type {WindowElement} */ (window);\n\n if (activeId && window.id === activeId) {\n win.activate();\n } else {\n win.deactivate();\n }\n },\n );\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.target;\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 this.removeEventListener(\"mousemove\", moveFn);\n\n document.removeEventListener(\"mouseup\", stopMove);\n document.removeEventListener(\"mouseleave\", stopMove);\n };\n\n this.addEventListener(\"mousemove\", moveFn);\n\n document.addEventListener(\"mouseup\", stopMove);\n document.addEventListener(\"mouseleave\", stopMove);\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":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-VBPEFHHO.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-W22PIYDE.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-W22PIYDE.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-W22PIYDE.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-W22PIYDE.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-W22PIYDE.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-W22PIYDE.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-WOKQPP3H.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-WOKQPP3H.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-WOKQPP3H.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-WOKQPP3H.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-WOKQPP3H.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-WOKQPP3H.js.map
+395
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YHA4F5AN.js
+395
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YHA4F5AN.js
···
1
+
import {
2
+
BroadcastableDiffuseElement
3
+
} from "./chunk-GULCWZMN.js";
4
+
import {
5
+
signal
6
+
} from "./chunk-LGHY5MKC.js";
7
+
import {
8
+
__name,
9
+
__privateAdd,
10
+
__privateGet,
11
+
__privateSet,
12
+
__publicField
13
+
} from "./chunk-B2VGR7JE.js";
14
+
15
+
// components/engine/audio/element.js
16
+
var _items, _volume;
17
+
var _AudioEngine = class _AudioEngine extends BroadcastableDiffuseElement {
18
+
constructor() {
19
+
super();
20
+
// SIGNALS
21
+
__privateAdd(this, _items, signal(
22
+
/** @type {Audio[]} */
23
+
[]
24
+
));
25
+
__privateAdd(this, _volume, signal(0.5));
26
+
__publicField(this, "$hasEnded", signal(false));
27
+
__publicField(this, "$isPlaying", signal(false));
28
+
// STATE
29
+
__publicField(this, "hasEnded", this.$hasEnded.get);
30
+
__publicField(this, "isPlaying", this.$isPlaying.get);
31
+
__publicField(this, "items", __privateGet(this, _items).get);
32
+
__publicField(this, "volume", __privateGet(this, _volume).get);
33
+
if (this.hasAttribute("group")) {
34
+
const fn = this.broadcast(`diffuse/engine/audio/${this.group}`);
35
+
this.pause = fn("pause", this.pause).leaderOnly;
36
+
this.play = fn("play", this.play).leaderOnly;
37
+
this.reload = fn("reload", this.reload).leaderOnly;
38
+
this.seek = fn("seek", this.seek).leaderOnly;
39
+
this.supply = fn("supply", this.supply).replicate;
40
+
this.$isPlaying.set = fn("isPlaying", this.$isPlaying.set).replicate;
41
+
}
42
+
}
43
+
// LIFECYCLE
44
+
/**
45
+
* @override
46
+
*/
47
+
connectedCallback() {
48
+
super.connectedCallback();
49
+
if (this.broadcasted) {
50
+
this.effect(async () => {
51
+
const status = await this.broadcastingStatus();
52
+
if (status.leader && status.initialLeader === false) {
53
+
}
54
+
});
55
+
}
56
+
this.effect(() => {
57
+
Array.from(this.querySelectorAll("de-audio-item audio")).forEach(
58
+
(node) => {
59
+
const audio = (
60
+
/** @type {HTMLAudioElement} */
61
+
node
62
+
);
63
+
if (audio.hasAttribute("preload")) return;
64
+
audio.volume = __privateGet(this, _volume).value;
65
+
}
66
+
);
67
+
});
68
+
}
69
+
// ACTIONS (PRIVATE)
70
+
/**
71
+
* @type {Actions["pause"]}
72
+
*/
73
+
pause({ audioId }) {
74
+
this.withAudioNode(audioId, (audio) => audio.pause());
75
+
}
76
+
/**
77
+
* @type {Actions["play"]}
78
+
*/
79
+
play({ audioId, volume }) {
80
+
this.withAudioNode(audioId, (audio, item) => {
81
+
audio.volume = volume ?? this.volume();
82
+
audio.muted = false;
83
+
if (audio.readyState === 0) audio.load();
84
+
if (!audio.isConnected) return;
85
+
const promise = audio.play() || Promise.resolve();
86
+
item.state({ isPlaying: true });
87
+
promise.catch((e) => {
88
+
if (!audio.isConnected) {
89
+
return;
90
+
}
91
+
const err = "Couldn't play audio automatically. Please resume playback manually.";
92
+
console.error(err, e);
93
+
item.state({ isPlaying: false });
94
+
});
95
+
});
96
+
}
97
+
/**
98
+
* @type {Actions["reload"]}
99
+
*/
100
+
reload(args) {
101
+
this.withAudioNode(args.audioId, (audio, item) => {
102
+
if (audio.readyState === 0 || audio.error?.code === 2) {
103
+
audio.load();
104
+
if (args.progress !== void 0) {
105
+
item.setAttribute(
106
+
"initial-progress",
107
+
JSON.stringify(args.progress)
108
+
);
109
+
}
110
+
if (args.play) {
111
+
this.play({ audioId: args.audioId, volume: audio.volume });
112
+
}
113
+
}
114
+
});
115
+
}
116
+
/**
117
+
* @type {Actions["seek"]}
118
+
*/
119
+
seek({ audioId, percentage }) {
120
+
this.withAudioNode(audioId, (audio) => {
121
+
if (!isNaN(audio.duration)) {
122
+
audio.currentTime = audio.duration * percentage;
123
+
}
124
+
});
125
+
}
126
+
/**
127
+
* @type {Actions["supply"]}
128
+
*/
129
+
supply(args) {
130
+
__privateGet(this, _items).value = args.audio;
131
+
if (args.play) this.play(args.play);
132
+
}
133
+
// RENDER
134
+
/**
135
+
* @param {RenderArg} _
136
+
*/
137
+
render({ html }) {
138
+
const nodes = this.items().map((audio) => {
139
+
const ip = audio.progress === void 0 ? "0" : JSON.stringify(audio.progress);
140
+
return html`
141
+
<de-audio-item
142
+
id="${audio.id}"
143
+
initial-progress="${ip}"
144
+
url="${audio.url}"
145
+
${audio.isPreload ? "preload" : ""}
146
+
${audio.mimeType ? 'mime-type="' + audio.mimeType + '"' : ""}
147
+
>
148
+
<audio
149
+
crossorigin="anonymous"
150
+
muted="true"
151
+
preload="auto"
152
+
>
153
+
<source
154
+
src="${audio.url}"
155
+
${audio.mimeType ? 'type="' + audio.mimeType + '"' : ""}
156
+
/>
157
+
</audio>
158
+
</de-audio-item>
159
+
`;
160
+
});
161
+
return html`
162
+
<section id="audio-nodes">
163
+
${nodes.join("")}
164
+
</section>
165
+
`;
166
+
}
167
+
// 🛠️
168
+
/**
169
+
* @param {string} audioId
170
+
* @param {(audio: HTMLAudioElement, item: AudioEngineItem) => void} fn
171
+
*/
172
+
withAudioNode(audioId, fn) {
173
+
const node = this.querySelector(
174
+
`de-audio-item[id="${audioId}"]:not([preload])`
175
+
);
176
+
if (node) {
177
+
const item = (
178
+
/** @type {AudioEngineItem} */
179
+
node
180
+
);
181
+
if (item) fn(item.audio, item);
182
+
}
183
+
}
184
+
};
185
+
_items = new WeakMap();
186
+
_volume = new WeakMap();
187
+
__name(_AudioEngine, "AudioEngine");
188
+
var AudioEngine = _AudioEngine;
189
+
var element_default = AudioEngine;
190
+
var _state;
191
+
var _AudioEngineItem = class _AudioEngineItem extends HTMLElement {
192
+
constructor() {
193
+
super();
194
+
/**
195
+
* @type {AudioState}
196
+
*/
197
+
__privateAdd(this, _state);
198
+
const ip = this.getAttribute("initial-progress");
199
+
__privateSet(this, _state, {
200
+
duration: 0,
201
+
hasEnded: false,
202
+
id: this.id,
203
+
isPlaying: true,
204
+
isPreload: this.hasAttribute("preload"),
205
+
loadingState: "loading",
206
+
mimeType: this.getAttribute("mime-type") ?? void 0,
207
+
progress: ip ? parseFloat(ip) : 0,
208
+
url: this.getAttribute("url") ?? ""
209
+
});
210
+
const audio = this.audio;
211
+
audio.addEventListener("canplay", this.canplayEvent);
212
+
audio.addEventListener("durationchange", this.durationchangeEvent);
213
+
audio.addEventListener("ended", this.endedEvent);
214
+
audio.addEventListener("error", this.errorEvent);
215
+
audio.addEventListener("pause", this.pauseEvent);
216
+
audio.addEventListener("play", this.playEvent);
217
+
audio.addEventListener("suspend", this.suspendEvent);
218
+
audio.addEventListener("timeupdate", this.timeupdateEvent);
219
+
audio.addEventListener("waiting", this.waitingEvent);
220
+
}
221
+
// RELATED ELEMENTS
222
+
get audio() {
223
+
const el = this.querySelector("audio");
224
+
if (el) return (
225
+
/** @type {HTMLAudioElement} */
226
+
el
227
+
);
228
+
else throw new Error("Cannot find child audio element");
229
+
}
230
+
get engine() {
231
+
const el = this.closest("de-audio");
232
+
if (el) return (
233
+
/** @type {AudioEngine} */
234
+
el
235
+
);
236
+
else return null;
237
+
}
238
+
// STATE
239
+
/**
240
+
* @param {Partial<AudioState> | undefined} [s]
241
+
*/
242
+
state(s) {
243
+
if (s) __privateSet(this, _state, { ...__privateGet(this, _state), ...s });
244
+
else return { ...__privateGet(this, _state) };
245
+
}
246
+
// EVENTS
247
+
/**
248
+
* @param {Event} event
249
+
*/
250
+
canplayEvent(event) {
251
+
const audio = (
252
+
/** @type {HTMLAudioElement} */
253
+
event.target
254
+
);
255
+
const item = engineItem(audio);
256
+
if (item?.hasAttribute("initial-progress") && audio.duration && !isNaN(audio.duration)) {
257
+
const progress = JSON.parse(
258
+
item.getAttribute("initial-progress") ?? "0"
259
+
);
260
+
audio.currentTime = audio.duration * progress;
261
+
item.removeAttribute("initial-progress");
262
+
}
263
+
finishedLoading(event);
264
+
}
265
+
/**
266
+
* @param {Event} event
267
+
*/
268
+
durationchangeEvent(event) {
269
+
const audio = (
270
+
/** @type {HTMLAudioElement} */
271
+
event.target
272
+
);
273
+
if (!isNaN(audio.duration)) {
274
+
engineItem(audio)?.state({ duration: audio.duration });
275
+
}
276
+
}
277
+
/**
278
+
* @param {Event} event
279
+
*/
280
+
endedEvent(event) {
281
+
const audio = (
282
+
/** @type {HTMLAudioElement} */
283
+
event.target
284
+
);
285
+
audio.currentTime = 0;
286
+
engineItem(audio)?.state({ hasEnded: true });
287
+
engineItem(audio)?.engine?.$hasEnded.set(true);
288
+
}
289
+
/**
290
+
* @param {Event} event
291
+
*/
292
+
errorEvent(event) {
293
+
const audio = (
294
+
/** @type {HTMLAudioElement} */
295
+
event.target
296
+
);
297
+
const code = audio.error?.code || 0;
298
+
engineItem(audio)?.state({ loadingState: { error: { code } } });
299
+
}
300
+
/**
301
+
* @param {Event} event
302
+
*/
303
+
pauseEvent(event) {
304
+
const audio = (
305
+
/** @type {HTMLAudioElement} */
306
+
event.target
307
+
);
308
+
const item = engineItem(audio);
309
+
const itemState = item?.state();
310
+
const ended = itemState ? itemState.hasEnded || itemState.progress === 1 : false;
311
+
item?.state({ isPlaying: false });
312
+
item?.engine?.$isPlaying.set(ended);
313
+
}
314
+
/**
315
+
* @param {Event} event
316
+
*/
317
+
playEvent(event) {
318
+
const audio = (
319
+
/** @type {HTMLAudioElement} */
320
+
event.target
321
+
);
322
+
engineItem(audio)?.state({ isPlaying: true });
323
+
engineItem(audio)?.engine?.$isPlaying.set(true);
324
+
if (audio.readyState === 4) finishedLoading(event);
325
+
}
326
+
/**
327
+
* @param {Event} event
328
+
*/
329
+
suspendEvent(event) {
330
+
finishedLoading(event);
331
+
}
332
+
/**
333
+
* @param {Event} event
334
+
*/
335
+
timeupdateEvent(event) {
336
+
const audio = (
337
+
/** @type {HTMLAudioElement} */
338
+
event.target
339
+
);
340
+
engineItem(audio)?.state({
341
+
progress: isNaN(audio.duration) || audio.duration === 0 ? 0 : audio.currentTime / audio.duration
342
+
});
343
+
}
344
+
/**
345
+
* @param {Event} event
346
+
*/
347
+
waitingEvent(event) {
348
+
initiateLoading(event);
349
+
}
350
+
};
351
+
_state = new WeakMap();
352
+
__name(_AudioEngineItem, "AudioEngineItem");
353
+
var AudioEngineItem = _AudioEngineItem;
354
+
function engineItem(audio) {
355
+
const c = audio.closest("de-audio-item");
356
+
if (c) return (
357
+
/** @type {AudioEngineItem} */
358
+
c
359
+
);
360
+
else return null;
361
+
}
362
+
__name(engineItem, "engineItem");
363
+
function finishedLoading(event) {
364
+
const audio = (
365
+
/** @type {HTMLAudioElement} */
366
+
event.target
367
+
);
368
+
engineItem(audio)?.state({ loadingState: "loaded" });
369
+
}
370
+
__name(finishedLoading, "finishedLoading");
371
+
function initiateLoading(event) {
372
+
const audio = (
373
+
/** @type {HTMLAudioElement} */
374
+
event.target
375
+
);
376
+
if (audio.readyState < 4) {
377
+
engineItem(audio)?.state({ loadingState: "loading" });
378
+
}
379
+
}
380
+
__name(initiateLoading, "initiateLoading");
381
+
var CLASS = AudioEngine;
382
+
var NAME = "de-audio";
383
+
var NAME_ITEM = "de-audio-item";
384
+
customElements.define(NAME, AudioEngine);
385
+
customElements.define(NAME_ITEM, AudioEngineItem);
386
+
387
+
export {
388
+
element_default,
389
+
AudioEngineItem,
390
+
CLASS,
391
+
NAME,
392
+
NAME_ITEM
393
+
};
394
+
395
+
//# sourceMappingURL=./chunk-YHA4F5AN.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YHA4F5AN.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YHA4F5AN.js.map
···
1
+
{"version":3,"sources":["/components/engine/audio/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\n/**\n * @import {Actions, Audio, AudioState, State} from \"./types.d.ts\"\n * @import {RenderArg} from \"@common/element.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 constructor() {\n super();\n\n // Setup leader election if shared\n if (this.hasAttribute(\"group\")) {\n const fn = this.broadcast(`diffuse/engine/audio/${this.group}`);\n\n this.pause = fn(\"pause\", this.pause).leaderOnly;\n this.play = fn(\"play\", this.play).leaderOnly;\n this.reload = fn(\"reload\", this.reload).leaderOnly;\n this.seek = fn(\"seek\", this.seek).leaderOnly;\n this.supply = fn(\"supply\", this.supply).replicate;\n\n this.$isPlaying.set = fn(\"isPlaying\", this.$isPlaying.set).replicate;\n }\n\n // TODO: Get volume from previous session if possible\n // const VOLUME_KEY = `@elements/engine/audio/${this.groupId}/volume`;\n // const vol = localStorage.getItem(VOLUME_KEY);\n }\n\n // SIGNALS\n\n #items = signal(/** @type {Audio[]} */ ([]));\n #volume = signal(0.5);\n\n $hasEnded = signal(false);\n $isPlaying = signal(false);\n\n // STATE\n\n hasEnded = this.$hasEnded.get;\n isPlaying = this.$isPlaying.get;\n items = this.#items.get;\n volume = this.#volume.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n connectedCallback() {\n super.connectedCallback();\n\n // Manage playback across tabs if needed\n if (this.broadcasted) {\n this.effect(async () => {\n const status = await this.broadcastingStatus();\n if (status.leader && status.initialLeader === false) {\n // TODO:\n // console.log(\"🧙 Leadership acquired\");\n }\n });\n }\n\n // Monitor volume\n // NOTE: Support different volume levels for audio elements?\n this.effect(() => {\n Array.from(this.querySelectorAll(\"de-audio-item audio\")).forEach(\n (node) => {\n const audio = /** @type {HTMLAudioElement} */ (node);\n if (audio.hasAttribute(\"preload\")) return;\n audio.volume = this.#volume.value;\n },\n );\n });\n }\n\n // ACTIONS (PRIVATE)\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 if (audio.readyState === 0) audio.load();\n if (!audio.isConnected) return;\n\n const promise = audio.play() || Promise.resolve();\n item.state({ isPlaying: 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: 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 this.#items.value = args.audio;\n if (args.play) this.play(args.play);\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n const nodes = this.items().map((audio) => {\n const ip = audio.progress === undefined\n ? \"0\"\n : JSON.stringify(audio.progress);\n\n return html`\n <de-audio-item\n id=\"${audio.id}\"\n initial-progress=\"${ip}\"\n url=\"${audio.url}\"\n ${audio.isPreload ? \"preload\" : \"\"}\n ${audio.mimeType ? 'mime-type=\"' + audio.mimeType + '\"' : \"\"}\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 return html`\n <section id=\"audio-nodes\">\n ${nodes.join(\"\")}\n </section>\n `;\n }\n\n // 🛠️\n\n /**\n * @param {string} audioId\n * @param {(audio: HTMLAudioElement, item: AudioEngineItem) => void} fn\n */\n withAudioNode(audioId, fn) {\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 if (item) fn(item.audio, item);\n }\n }\n}\n\nexport default AudioEngine;\n\n////////////////////////////////////////////\n// ITEM ELEMENT\n////////////////////////////////////////////\n\nclass AudioEngineItem extends HTMLElement {\n /**\n * @type {AudioState}\n */\n #state;\n\n constructor() {\n super();\n\n const ip = this.getAttribute(\"initial-progress\");\n\n this.#state = {\n duration: 0,\n hasEnded: false,\n id: this.id,\n isPlaying: true,\n isPreload: this.hasAttribute(\"preload\"),\n loadingState: \"loading\",\n mimeType: this.getAttribute(\"mime-type\") ?? undefined,\n progress: ip ? parseFloat(ip) : 0,\n url: this.getAttribute(\"url\") ?? \"\",\n };\n\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\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 // STATE\n\n /**\n * @param {Partial<AudioState> | undefined} [s]\n */\n state(s) {\n if (s) this.#state = { ...this.#state, ...s };\n else return { ...this.#state };\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: 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: true });\n engineItem(audio)?.engine?.$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: { error: { code } } });\n }\n\n /**\n * @param {Event} event\n */\n pauseEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n\n const item = engineItem(audio);\n const itemState = item?.state();\n const ended = itemState\n ? itemState.hasEnded || itemState.progress === 1\n : false;\n\n item?.state({ isPlaying: false });\n item?.engine?.$isPlaying.set(ended);\n }\n\n /**\n * @param {Event} event\n */\n playEvent(event) {\n const audio = /** @type {HTMLAudioElement} */ (event.target);\n\n engineItem(audio)?.state({ isPlaying: true });\n engineItem(audio)?.engine?.$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\n engineItem(audio)?.state({\n progress: isNaN(audio.duration) || audio.duration === 0\n ? 0\n : audio.currentTime / audio.duration,\n });\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: \"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: \"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"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-YHA4F5AN.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YPPYTUB4.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YPPYTUB4.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-YPPYTUB4.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YPPYTUB4.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/chunk-YPPYTUB4.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/chunk-YPPYTUB4.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/constants.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/common/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/constants.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/constants.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/common/constants.js.map
+17
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/element.js
+17
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/element.js
···
1
+
import {
2
+
BroadcastableDiffuseElement,
3
+
DiffuseElement,
4
+
component,
5
+
query
6
+
} from "../chunk-GULCWZMN.js";
7
+
import "../chunk-SR6AOZ6U.js";
8
+
import "../chunk-LGHY5MKC.js";
9
+
import "../chunk-B2VGR7JE.js";
10
+
export {
11
+
BroadcastableDiffuseElement,
12
+
DiffuseElement,
13
+
component,
14
+
query
15
+
};
16
+
17
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/common/element.js.map
+23
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/index.js
+23
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/index.js
···
1
+
import {
2
+
arrayShuffle,
3
+
boolAttr,
4
+
groupTracksPerScheme,
5
+
hash,
6
+
isPrimitive,
7
+
jsonDecode,
8
+
jsonEncode,
9
+
trackArtworkCacheId
10
+
} from "../chunk-QL3YB5K6.js";
11
+
import "../chunk-B2VGR7JE.js";
12
+
export {
13
+
arrayShuffle,
14
+
boolAttr,
15
+
groupTracksPerScheme,
16
+
hash,
17
+
isPrimitive,
18
+
jsonDecode,
19
+
jsonEncode,
20
+
trackArtworkCacheId
21
+
};
22
+
23
+
//# sourceMappingURL=./index.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/index.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/index.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/common/index.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/signal.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/signal.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/common/signal.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/signal.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/signal.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/common/signal.js.map
+24
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/worker.js
+24
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/worker.js
···
1
+
import {
2
+
announce,
3
+
define,
4
+
getTransferables,
5
+
listen,
6
+
ostiary,
7
+
portProvider,
8
+
proxyProvider,
9
+
use
10
+
} from "../chunk-SR6AOZ6U.js";
11
+
import "../chunk-LGHY5MKC.js";
12
+
import "../chunk-B2VGR7JE.js";
13
+
export {
14
+
announce,
15
+
define,
16
+
getTransferables,
17
+
listen,
18
+
ostiary,
19
+
portProvider,
20
+
proxyProvider,
21
+
use
22
+
};
23
+
24
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/common/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/common/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/common.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/configurator/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/common.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/configurator/common.js.map
+123
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/input/worker.js
+123
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/input/worker.js
···
1
+
import {
2
+
require_uri_all
3
+
} from "../../../chunk-4BP3OKIA.js";
4
+
import {
5
+
groupTracksPerScheme
6
+
} from "../../../chunk-QL3YB5K6.js";
7
+
import {
8
+
connectionsFromQuery
9
+
} from "../../../chunk-DNMGZHZC.js";
10
+
import "../../../chunk-7WBXGB7R.js";
11
+
import {
12
+
use
13
+
} from "../../../chunk-SR6AOZ6U.js";
14
+
import "../../../chunk-LGHY5MKC.js";
15
+
import {
16
+
__name,
17
+
__toESM
18
+
} from "../../../chunk-B2VGR7JE.js";
19
+
20
+
// components/configurator/input/worker.js
21
+
var URI = __toESM(require_uri_all());
22
+
var connections = connectionsFromQuery(location);
23
+
function proxy(scheme, actionName) {
24
+
const worker = connections[scheme];
25
+
const proxyFn = use(actionName, worker);
26
+
return proxyFn;
27
+
}
28
+
__name(proxy, "proxy");
29
+
function isSupportedScheme(scheme) {
30
+
return !!connections[scheme];
31
+
}
32
+
__name(isSupportedScheme, "isSupportedScheme");
33
+
async function consult(fileUriOrScheme) {
34
+
const scheme = fileUriOrScheme.includes(":") ? URI.parse(fileUriOrScheme).scheme || fileUriOrScheme : fileUriOrScheme;
35
+
if (!isSupportedScheme(scheme)) {
36
+
return { supported: false, reason: "Unsupported scheme" };
37
+
}
38
+
return await proxy(scheme, "consult")(fileUriOrScheme);
39
+
}
40
+
__name(consult, "consult");
41
+
async function contextualize(tracks) {
42
+
const groups = groupTracks(tracks);
43
+
const promises = Object.entries(groups).map(
44
+
async ([scheme, tracksGroup]) => {
45
+
if (!isSupportedScheme(scheme) || tracksGroup.length === 0) return;
46
+
return await proxy(scheme, "contextualize")(tracksGroup);
47
+
}
48
+
);
49
+
await Promise.all(promises);
50
+
}
51
+
__name(contextualize, "contextualize");
52
+
async function groupConsult(tracks) {
53
+
const groups = groupTracksPerScheme(tracks);
54
+
const consultations = await Promise.all(
55
+
Object.keys(groups).map(async (scheme) => {
56
+
if (!isSupportedScheme(scheme)) {
57
+
return {
58
+
[scheme]: {
59
+
available: false,
60
+
reason: "Unsupported scheme",
61
+
tracks: groups[scheme] || []
62
+
}
63
+
};
64
+
}
65
+
return await proxy(scheme, "groupConsult")(groups[scheme] || {});
66
+
})
67
+
);
68
+
return consultations.reduce((acc, c) => {
69
+
return { ...acc, ...c };
70
+
}, {});
71
+
}
72
+
__name(groupConsult, "groupConsult");
73
+
async function list(cachedTracks = []) {
74
+
const groups = await groupConsult(cachedTracks);
75
+
Object.keys(connections).forEach((scheme) => {
76
+
if (!groups[scheme]) groups[scheme] = { available: true, tracks: [] };
77
+
});
78
+
const promises = Object.entries(groups).map(
79
+
async ([scheme, { available, tracks: tracks2 }]) => {
80
+
if (!available) return tracks2;
81
+
if (!isSupportedScheme(scheme)) return tracks2;
82
+
return await proxy(scheme, "list")(tracks2);
83
+
}
84
+
);
85
+
const nested = await Promise.all(promises);
86
+
const tracks = nested.flat(1);
87
+
return tracks;
88
+
}
89
+
__name(list, "list");
90
+
async function resolve(args) {
91
+
const scheme = args.uri.split(":", 1)[0];
92
+
if (!isSupportedScheme(scheme)) return void 0;
93
+
try {
94
+
return await proxy(scheme, "resolve")(args);
95
+
} catch (err) {
96
+
console.error(
97
+
`[configurator/input] Resolve error for scheme '${scheme}'.`,
98
+
err
99
+
);
100
+
}
101
+
}
102
+
__name(resolve, "resolve");
103
+
function groupTracks(tracks) {
104
+
const grouped = groupTracksPerScheme(
105
+
tracks,
106
+
Object.fromEntries(
107
+
Object.entries(connections).map(([k, _v]) => {
108
+
return [k, []];
109
+
})
110
+
)
111
+
);
112
+
return grouped;
113
+
}
114
+
__name(groupTracks, "groupTracks");
115
+
export {
116
+
consult,
117
+
contextualize,
118
+
groupConsult,
119
+
list,
120
+
resolve
121
+
};
122
+
123
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/input/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/configurator/input/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/configurator/input/worker.js.map
+20
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/audio/element.js
+20
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/audio/element.js
···
1
+
import {
2
+
AudioEngineItem,
3
+
CLASS,
4
+
NAME,
5
+
NAME_ITEM,
6
+
element_default
7
+
} from "../../../chunk-YHA4F5AN.js";
8
+
import "../../../chunk-GULCWZMN.js";
9
+
import "../../../chunk-SR6AOZ6U.js";
10
+
import "../../../chunk-LGHY5MKC.js";
11
+
import "../../../chunk-B2VGR7JE.js";
12
+
export {
13
+
AudioEngineItem,
14
+
CLASS,
15
+
NAME,
16
+
NAME_ITEM,
17
+
element_default as default
18
+
};
19
+
20
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/audio/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/audio/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/engine/audio/element.js.map
+18
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/element.js
+18
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-FAZWEBEJ.js";
6
+
import "../../../chunk-QL3YB5K6.js";
7
+
import "../../../chunk-7WBXGB7R.js";
8
+
import "../../../chunk-GULCWZMN.js";
9
+
import "../../../chunk-SR6AOZ6U.js";
10
+
import "../../../chunk-LGHY5MKC.js";
11
+
import "../../../chunk-B2VGR7JE.js";
12
+
export {
13
+
CLASS,
14
+
NAME,
15
+
element_default as default
16
+
};
17
+
18
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/engine/queue/element.js.map
+173
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/worker.js
+173
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/worker.js
···
1
+
import {
2
+
arrayShuffle,
3
+
hash
4
+
} from "../../../chunk-QL3YB5K6.js";
5
+
import {
6
+
announce,
7
+
define,
8
+
ostiary
9
+
} from "../../../chunk-SR6AOZ6U.js";
10
+
import {
11
+
effect,
12
+
signal
13
+
} from "../../../chunk-LGHY5MKC.js";
14
+
import {
15
+
__name
16
+
} from "../../../chunk-B2VGR7JE.js";
17
+
18
+
// components/engine/queue/worker.js
19
+
var $lake = signal(
20
+
/** @type {Track[]} */
21
+
[]
22
+
);
23
+
var $future = signal(
24
+
/** @type {Item[]} */
25
+
[]
26
+
);
27
+
var $now = signal(
28
+
/** @type {Item | null} */
29
+
null
30
+
);
31
+
var $past = signal(
32
+
/** @type {Item[]} */
33
+
[]
34
+
);
35
+
var $poolHash = signal(hash([]));
36
+
function add({ inFront, tracks }) {
37
+
const items = tracks.map((track) => {
38
+
return { ...track, manualEntry: true };
39
+
});
40
+
$future.value = inFront ? [...items, ...$future.value] : [...$future.value, ...items];
41
+
}
42
+
__name(add, "add");
43
+
function fill({ augment, amount, shuffled }) {
44
+
$future.value = fillQueue(
45
+
shuffled,
46
+
amount + (augment ? $future.value.filter((i) => i.manualEntry === false).length : 0),
47
+
$future.value
48
+
);
49
+
}
50
+
__name(fill, "fill");
51
+
function pool(tracks) {
52
+
$lake.value = tracks;
53
+
$poolHash.value = hash(tracks);
54
+
}
55
+
__name(pool, "pool");
56
+
function shift() {
57
+
return _shift();
58
+
}
59
+
__name(shift, "shift");
60
+
function unshift() {
61
+
const p = $past.value;
62
+
if (p.length === 0) return;
63
+
const n = $now.value;
64
+
const [last] = p.splice(p.length - 1, 1);
65
+
$now.value = last ?? null;
66
+
if (n) $future.value = [n, ...$future.value];
67
+
}
68
+
__name(unshift, "unshift");
69
+
ostiary((port) => {
70
+
define("future", $future.get, port);
71
+
define("now", $now.get, port);
72
+
define("past", $past.get, port);
73
+
define("poolHash", $poolHash.get, port);
74
+
define("add", add, port);
75
+
define("fill", fill, port);
76
+
define("pool", pool, port);
77
+
define("shift", shift, port);
78
+
define("unshift", unshift, port);
79
+
effect(() => announce("future", $future.value, port));
80
+
effect(() => announce("now", $now.value, port));
81
+
effect(() => announce("past", $past.value, port));
82
+
effect(() => announce("poolHash", $poolHash.value, port));
83
+
effect(() => {
84
+
const existing = new Set($lake.value.map((t) => t.id));
85
+
$future.value = $future.value.filter((i) => {
86
+
return existing.has(i.id);
87
+
});
88
+
});
89
+
});
90
+
function fillQueue(shuffled, fillAmount, future) {
91
+
if (!fillAmount) return future;
92
+
let autoFutureCount = 0;
93
+
let manualFutureCount = 0;
94
+
future.forEach((item) => {
95
+
if (item.manualEntry) manualFutureCount++;
96
+
else autoFutureCount++;
97
+
});
98
+
if (shuffled) {
99
+
if (autoFutureCount >= fillAmount) return future;
100
+
return fillShuffle(fillAmount, future, autoFutureCount);
101
+
} else {
102
+
return fillSequentially(fillAmount, future);
103
+
}
104
+
}
105
+
__name(fillQueue, "fillQueue");
106
+
function fillSequentially(fillAmount, future) {
107
+
const onlyManual = future.filter((i) => i.manualEntry);
108
+
const lastManual = onlyManual.slice(-1)[0];
109
+
const startIndex = lastManual ? $lake.value.findIndex((t) => t.id === lastManual.id) + 1 : $now.value ? $lake.value.findIndex((t) => t.id === $now.value?.id) + 1 : 0;
110
+
const maxIndex = $lake.value.length - 1;
111
+
let currIndex = startIndex;
112
+
const autoItems = [];
113
+
for (let i = 0; i < fillAmount; i++) {
114
+
if (currIndex > maxIndex) currIndex = 0;
115
+
const item = $lake.value[currIndex];
116
+
if (item) {
117
+
autoItems.push({
118
+
...item,
119
+
manualEntry: false
120
+
});
121
+
}
122
+
currIndex++;
123
+
}
124
+
return [...onlyManual, ...autoItems];
125
+
}
126
+
__name(fillSequentially, "fillSequentially");
127
+
function fillShuffle(fillAmount, future, autoFutureCount) {
128
+
const pool2 = [];
129
+
const pastSet = new Set($past.value.map((i) => i.id));
130
+
let reducedPool = pool2;
131
+
$lake.value.forEach((track) => {
132
+
if (pastSet.delete(track.id) === false) {
133
+
pool2.push({
134
+
...track,
135
+
manualEntry: false
136
+
});
137
+
}
138
+
});
139
+
if (reducedPool.length === 0) {
140
+
reducedPool = $lake.value;
141
+
}
142
+
const poolSelection = arrayShuffle(reducedPool).slice(
143
+
0,
144
+
Math.max(0, fillAmount - autoFutureCount)
145
+
);
146
+
return [...future, ...poolSelection];
147
+
}
148
+
__name(fillShuffle, "fillShuffle");
149
+
function _shift(future) {
150
+
const n = $now.value;
151
+
const f = future ?? $future.value;
152
+
$now.value = f[0] ?? null;
153
+
if (n) $past.value = [...$past.value, n];
154
+
$future.value = f.slice(1);
155
+
}
156
+
__name(_shift, "_shift");
157
+
export {
158
+
$future,
159
+
$lake,
160
+
$now,
161
+
$past,
162
+
$poolHash,
163
+
_shift,
164
+
add,
165
+
fill,
166
+
fillSequentially,
167
+
fillShuffle,
168
+
pool,
169
+
shift,
170
+
unshift
171
+
};
172
+
173
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/engine/queue/worker.js.map
···
1
+
{"version":3,"sources":["/worker.js"],"sourcesContent":["import { announce, define, ostiary } from \"@common/worker.js\";\nimport { effect, signal } from \"@common/signal.js\";\nimport { arrayShuffle, hash } from \"@common/index.js\";\n\n/**\n * @import {Actions, Item} from \"./types.d.ts\"\n * @import {Track} from \"@common/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// STATE\n////////////////////////////////////////////\n\nexport const $lake = signal(/** @type {Track[]} */ ([]));\n\n// Communicated state\nexport const $future = signal(/** @type {Item[]} */ ([]));\nexport const $now = signal(/** @type {Item | null} */ (null));\nexport const $past = signal(/** @type {Item[]} */ ([]));\nexport const $poolHash = signal(hash([]));\n\n////////////////////////////////////////////\n// ACTIONS\n////////////////////////////////////////////\n\n/**\n * @type {Actions['add']}\n */\nexport function add({ inFront, tracks }) {\n const items = tracks.map((track) => {\n return { ...track, manualEntry: true };\n });\n\n $future.value = inFront\n ? [...items, ...$future.value]\n : [...$future.value, ...items];\n}\n\n/**\n * @type {Actions['fill']}\n */\nexport function fill({ augment, amount, shuffled }) {\n $future.value = fillQueue(\n shuffled,\n amount +\n (augment\n ? $future.value.filter((i) => i.manualEntry === false).length\n : 0),\n $future.value,\n );\n}\n\n/**\n * @type {Actions['pool']}\n */\nexport function pool(tracks) {\n $lake.value = tracks;\n $poolHash.value = hash(tracks);\n}\n\n/**\n * @type {Actions['shift']}\n */\nexport function shift() {\n return _shift();\n}\n\n/**\n * @type {Actions['unshift']}\n */\nexport function unshift() {\n const p = $past.value;\n if (p.length === 0) return;\n\n const n = $now.value;\n const [last] = p.splice(p.length - 1, 1);\n\n $now.value = last ?? null;\n if (n) $future.value = [n, ...$future.value];\n}\n\n////////////////////////////////////////////\n// ⚡️\n////////////////////////////////////////////\n\nostiary((port) => {\n // Setup RPC\n\n define(\"future\", $future.get, port);\n define(\"now\", $now.get, port);\n define(\"past\", $past.get, port);\n define(\"poolHash\", $poolHash.get, port);\n\n define(\"add\", add, port);\n define(\"fill\", fill, port);\n define(\"pool\", pool, port);\n define(\"shift\", shift, port);\n define(\"unshift\", unshift, port);\n\n // Communicate state\n\n effect(() => announce(\"future\", $future.value, port));\n effect(() => announce(\"now\", $now.value, port));\n effect(() => announce(\"past\", $past.value, port));\n effect(() => announce(\"poolHash\", $poolHash.value, port));\n\n // Effects\n\n // When the pool changes,\n // make sure all future queue items still exist.\n effect(() => {\n const existing = new Set($lake.value.map((t) => t.id));\n\n $future.value = $future.value.filter((i) => {\n return existing.has(i.id);\n });\n });\n});\n\n////////////////////////////////////////////\n// ⛔️\n////////////////////////////////////////////\n\n/**\n * Add non-manual items to the queue.\n *\n * @param {boolean} shuffled\n * @param {number | undefined | null} fillAmount\n * @param {Item[]} future\n * @returns {Item[]}\n */\nfunction fillQueue(shuffled, fillAmount, future) {\n if (!fillAmount) return future;\n\n // Count\n let autoFutureCount = 0;\n let manualFutureCount = 0;\n\n future.forEach((item) => {\n if (item.manualEntry) manualFutureCount++;\n else autoFutureCount++;\n });\n\n // Fill\n if (shuffled) {\n if (autoFutureCount >= fillAmount) return future;\n return fillShuffle(fillAmount, future, autoFutureCount);\n } else {\n return fillSequentially(fillAmount, future);\n }\n}\n\n/**\n * @param {number} fillAmount\n * @param {Item[]} future\n * @returns {Item[]}\n */\nexport function fillSequentially(fillAmount, future) {\n const onlyManual = future.filter((i) => i.manualEntry);\n const lastManual = onlyManual.slice(-1)[0];\n const startIndex = lastManual\n ? $lake.value.findIndex((t) => t.id === lastManual.id) + 1\n : $now.value\n ? $lake.value.findIndex((t) => t.id === $now.value?.id) + 1\n : 0;\n\n const maxIndex = $lake.value.length - 1;\n let currIndex = startIndex;\n\n /** @type {Item[]} */\n const autoItems = [];\n\n for (let i = 0; i < fillAmount; i++) {\n if (currIndex > maxIndex) currIndex = 0;\n const item = $lake.value[currIndex];\n if (item) {\n autoItems.push({\n ...item,\n manualEntry: false,\n });\n }\n currIndex++;\n }\n\n return [...onlyManual, ...autoItems];\n}\n\n/**\n * @param {number} fillAmount\n * @param {Item[]} future\n * @param {number} autoFutureCount\n * @returns {Item[]}\n */\nexport function fillShuffle(fillAmount, future, autoFutureCount) {\n // Determine pool of available queue items\n /** @type {Item[]} */\n const pool = [];\n\n const pastSet = new Set($past.value.map((i) => i.id));\n let reducedPool = pool;\n\n $lake.value.forEach((track) => {\n if (pastSet.delete(track.id) === false) {\n pool.push({\n ...track,\n manualEntry: false,\n });\n }\n });\n\n if (reducedPool.length === 0) {\n reducedPool = $lake.value;\n }\n\n const poolSelection = arrayShuffle(reducedPool).slice(\n 0,\n Math.max(0, fillAmount - autoFutureCount),\n );\n\n return [...future, ...poolSelection];\n}\n\n/**\n * @param {Item[]} [future]\n */\nexport function _shift(future) {\n const n = $now.value;\n const f = future ?? $future.value;\n\n $now.value = f[0] ?? null;\n if (n) $past.value = [...$past.value, n];\n $future.value = f.slice(1);\n}\n"],"mappings":"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","names":["pool"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/engine/queue/worker.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/common.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/common.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/common.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/opensubsonic/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/common.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/opensubsonic/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/constants.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/opensubsonic/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/constants.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/constants.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/opensubsonic/constants.js.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-2G4V2WLU.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/opensubsonic/element.js.map
+227
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/worker.js
+227
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/worker.js
···
1
+
import {
2
+
autoTypeToTrackKind,
3
+
buildURI,
4
+
consultServer,
5
+
createClient,
6
+
groupTracksByServer,
7
+
loadServers,
8
+
parseURI,
9
+
saveServers,
10
+
serverId,
11
+
serversFromTracks
12
+
} from "../../../chunk-UULQAGTI.js";
13
+
import {
14
+
SCHEME
15
+
} from "../../../chunk-DHVMQUNY.js";
16
+
import "../../../chunk-JMCNYZY6.js";
17
+
import {
18
+
require_uri_all
19
+
} from "../../../chunk-4BP3OKIA.js";
20
+
import "../../../chunk-7WBXGB7R.js";
21
+
import {
22
+
announce,
23
+
define,
24
+
ostiary
25
+
} from "../../../chunk-SR6AOZ6U.js";
26
+
import {
27
+
effect,
28
+
signal
29
+
} from "../../../chunk-LGHY5MKC.js";
30
+
import {
31
+
__name,
32
+
__toESM
33
+
} from "../../../chunk-B2VGR7JE.js";
34
+
35
+
// components/input/opensubsonic/worker.js
36
+
var URI = __toESM(require_uri_all());
37
+
var $servers = signal(
38
+
/** @type {Record<string, Server>} */
39
+
{}
40
+
);
41
+
effect(() => {
42
+
saveServers($servers.value);
43
+
});
44
+
async function consult(fileUriOrScheme) {
45
+
if (!fileUriOrScheme.includes(":")) {
46
+
return { supported: true, consult: "undetermined" };
47
+
}
48
+
const parsed = parseURI(fileUriOrScheme);
49
+
if (!parsed) return { supported: true, consult: "undetermined" };
50
+
const consult2 = await consultServer(parsed.server);
51
+
return { supported: true, consult: consult2 };
52
+
}
53
+
__name(consult, "consult");
54
+
async function contextualize(tracks) {
55
+
const servers = serversFromTracks(tracks);
56
+
$servers.value = servers;
57
+
}
58
+
__name(contextualize, "contextualize");
59
+
async function groupConsult(tracks) {
60
+
const groups = groupTracksByServer(tracks);
61
+
const promises = Object.entries(groups).map(
62
+
async ([serverId2, { server, tracks: tracks2 }]) => {
63
+
const available = await consultServer(server);
64
+
const grouping = available ? { available, tracks: tracks2 } : { available, reason: "Server ping failed", tracks: tracks2 };
65
+
return {
66
+
// key: `${SCHEME}:${serverId}`,
67
+
key: SCHEME,
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
+
cachedTracks.forEach((t) => {
79
+
const parsed = parseURI(t.uri);
80
+
if (!parsed || !parsed.path) return;
81
+
const sid = serverId(parsed?.server);
82
+
cache[sid] ??= {};
83
+
cache[sid][URI.unescapeComponent(parsed.path)] = t;
84
+
});
85
+
async function search(client, offset = 0) {
86
+
const result = await client.search3({
87
+
query: "",
88
+
artistCount: 0,
89
+
albumCount: 0,
90
+
songCount: 1e3,
91
+
songOffset: offset
92
+
});
93
+
const songs = result.searchResult3.song || [];
94
+
if (songs.length === 1e3) {
95
+
const moreSongs = await search(client, offset + 1e3);
96
+
return [...songs, ...moreSongs];
97
+
}
98
+
return songs;
99
+
}
100
+
__name(search, "search");
101
+
const servers = await loadServers();
102
+
const promises = Object.values(servers).map(async (server) => {
103
+
const client = createClient(server);
104
+
const sid = serverId(server);
105
+
const list2 = await search(client, 0);
106
+
return list2.filter((song) => !song.isVideo).map((song) => {
107
+
const path = song.path ? song.path.startsWith("/") ? song.path : `/${song.path}` : void 0;
108
+
const fromCache = path ? cache[sid]?.[path] : void 0;
109
+
if (fromCache) return fromCache;
110
+
const track = {
111
+
$type: "sh.diffuse.output.tracks",
112
+
id: crypto.randomUUID(),
113
+
kind: autoTypeToTrackKind(song.type),
114
+
uri: buildURI(server, { songId: song.id, path }),
115
+
stats: {
116
+
albumGain: void 0,
117
+
bitrate: song.bitRate ? song.bitRate * 1e3 : void 0,
118
+
bitsPerSample: void 0,
119
+
codec: void 0,
120
+
container: void 0,
121
+
duration: song.duration,
122
+
lossless: void 0,
123
+
numberOfChannels: void 0,
124
+
sampleRate: void 0,
125
+
trackGain: void 0
126
+
},
127
+
tags: {
128
+
album: song.album,
129
+
albumartist: song.albumArtists?.[0]?.name,
130
+
albumartists: song.albumArtists?.map((a) => a.name),
131
+
albumartistsort: song.albumArtists?.[0]?.sortName,
132
+
albumsort: void 0,
133
+
arranger: void 0,
134
+
artist: song.artist ?? song.displayArtist,
135
+
artists: void 0,
136
+
artistsort: void 0,
137
+
asin: void 0,
138
+
averageLevel: void 0,
139
+
barcode: void 0,
140
+
bpm: song.bpm,
141
+
catalognumbers: void 0,
142
+
compilation: void 0,
143
+
composers: song.displayComposer ? [song.displayComposer] : void 0,
144
+
composersort: void 0,
145
+
conductors: void 0,
146
+
date: void 0,
147
+
disc: {
148
+
no: song.discNumber || 1
149
+
},
150
+
djmixers: void 0,
151
+
engineers: void 0,
152
+
gapless: void 0,
153
+
genres: song.genres,
154
+
isrc: void 0,
155
+
labels: void 0,
156
+
lyricists: void 0,
157
+
media: void 0,
158
+
mixers: void 0,
159
+
moods: song.moods,
160
+
originaldate: void 0,
161
+
originalyear: void 0,
162
+
peakLevel: void 0,
163
+
producers: void 0,
164
+
publishers: void 0,
165
+
releasecountry: void 0,
166
+
releasedate: void 0,
167
+
releasestatus: void 0,
168
+
releasetypes: void 0,
169
+
remixers: void 0,
170
+
technicians: void 0,
171
+
title: song.title ?? "Unknown",
172
+
titlesort: void 0,
173
+
track: {
174
+
no: song.track ?? 1,
175
+
of: song.size
176
+
},
177
+
work: void 0,
178
+
writers: void 0,
179
+
year: song.year
180
+
}
181
+
};
182
+
return track;
183
+
});
184
+
});
185
+
const tracks = (await Promise.all(promises)).flat(1);
186
+
if (tracks.length) return tracks;
187
+
return Object.values(servers).map((server) => {
188
+
return {
189
+
$type: "sh.diffuse.output.tracks",
190
+
id: crypto.randomUUID(),
191
+
kind: "placeholder",
192
+
uri: buildURI(server)
193
+
};
194
+
});
195
+
}
196
+
__name(list, "list");
197
+
async function resolve({ uri }) {
198
+
const parsed = parseURI(uri);
199
+
if (!parsed) return void 0;
200
+
const client = createClient(parsed.server);
201
+
const songId = parsed.songId;
202
+
if (!songId) return void 0;
203
+
const url = await client.download({
204
+
id: songId,
205
+
format: "raw"
206
+
}).then((a) => a.url);
207
+
return { expiresAt: Infinity, url };
208
+
}
209
+
__name(resolve, "resolve");
210
+
ostiary((port) => {
211
+
define("servers", $servers.get, port);
212
+
define("consult", consult, port);
213
+
define("contextualize", contextualize, port);
214
+
define("groupConsult", groupConsult, port);
215
+
define("list", list, port);
216
+
define("resolve", resolve, port);
217
+
effect(() => announce("servers", $servers.value, port));
218
+
});
219
+
export {
220
+
consult,
221
+
contextualize,
222
+
groupConsult,
223
+
list,
224
+
resolve
225
+
};
226
+
227
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/opensubsonic/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/opensubsonic/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/common.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/s3/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/common.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/s3/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/constants.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/s3/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/constants.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/constants.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/s3/constants.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/worker.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/worker.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/s3/worker.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/input/s3/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/input/s3/worker.js.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-RMIZJ6MT.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/orchestrator/process-tracks/element.js.map
+69
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/worker.js
+69
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/worker.js
···
1
+
import {
2
+
INPUT_ACTIONS
3
+
} from "../../../chunk-WOKQPP3H.js";
4
+
import {
5
+
define,
6
+
ostiary,
7
+
proxyProvider
8
+
} from "../../../chunk-SR6AOZ6U.js";
9
+
import {
10
+
deep_diff_default
11
+
} from "../../../chunk-LGHY5MKC.js";
12
+
import {
13
+
__name
14
+
} from "../../../chunk-B2VGR7JE.js";
15
+
16
+
// components/orchestrator/process-tracks/worker.js
17
+
async function process(args) {
18
+
const { ports } = args;
19
+
const cachedTracks = args.tracks;
20
+
const inputProvider = proxyProvider(INPUT_ACTIONS);
21
+
const input = inputProvider(ports.input);
22
+
const metadataProcessorProvider = proxyProvider(["supply"]);
23
+
const metadataProcessor = metadataProcessorProvider(ports.metadataProcessor);
24
+
ports.input.start();
25
+
ports.metadataProcessor.start();
26
+
await input.contextualize(cachedTracks);
27
+
const tracks = await input.list(cachedTracks);
28
+
const tracksWithMetadata = await tracks.reduce(
29
+
/**
30
+
* @param {Promise<Track[]>} promise
31
+
* @param {Track} track
32
+
*/
33
+
async (promise, track) => {
34
+
const acc = await promise;
35
+
if (track.tags && track.stats) return [...acc, track];
36
+
const resGet = await input.resolve({
37
+
method: "GET",
38
+
uri: track.uri
39
+
});
40
+
if (!resGet) return [...acc, track];
41
+
const resHead = "stream" in resGet ? void 0 : await input.resolve({
42
+
method: "HEAD",
43
+
uri: track.uri
44
+
});
45
+
const { stats, tags } = await metadataProcessor.supply({
46
+
stream: "stream" in resGet ? resGet.stream : void 0,
47
+
urls: "url" in resGet ? {
48
+
get: resGet.url,
49
+
head: resHead && "url" in resHead ? resHead.url : resGet.url
50
+
} : void 0
51
+
});
52
+
return [...acc, { ...track, stats, tags }];
53
+
},
54
+
Promise.resolve([])
55
+
);
56
+
const diff = deep_diff_default.diff(tracksWithMetadata, cachedTracks);
57
+
const changed = !!diff;
58
+
if (changed) return tracksWithMetadata;
59
+
return null;
60
+
}
61
+
__name(process, "process");
62
+
ostiary((port) => {
63
+
define("process", process, port);
64
+
});
65
+
export {
66
+
process
67
+
};
68
+
69
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/process-tracks/worker.js.map
···
1
+
{"version":3,"sources":["/worker.js"],"sourcesContent":["import deepDiff from \"@fry69/deep-diff\";\nimport { define, ostiary, proxyProvider } from \"@common/worker.js\";\nimport { INPUT_ACTIONS } from \"@common/constants.js\";\n\n/**\n * @import {InputActions, Track} from \"@common/types.d.ts\"\n * @import {ProxyProvider} from \"@common/worker.d.ts\"\n * @import {Actions as MetadataProcessorActions} from \"@components/processor/metadata/types.d.ts\"\n * @import {Actions} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ACTIONS\n////////////////////////////////////////////\n\n/**\n * @type {Actions[\"process\"]}\n */\nexport async function process(args) {\n const { ports } = args;\n const cachedTracks = args.tracks;\n\n /** @type {ProxyProvider<InputActions>} */\n const inputProvider = proxyProvider(INPUT_ACTIONS);\n const input = inputProvider(ports.input);\n\n /** @type {ProxyProvider<MetadataProcessorActions>} */\n const metadataProcessorProvider = proxyProvider([\"supply\"]);\n const metadataProcessor = metadataProcessorProvider(ports.metadataProcessor);\n\n ports.input.start();\n ports.metadataProcessor.start();\n\n // Contextualize\n await input.contextualize(cachedTracks);\n\n // List\n const tracks = await input.list(cachedTracks);\n\n // Fetch metadata if needed\n const tracksWithMetadata = await tracks.reduce(\n /**\n * @param {Promise<Track[]>} promise\n * @param {Track} track\n */\n async (promise, track) => {\n const acc = await promise;\n\n if (track.tags && track.stats) return [...acc, track];\n\n const resGet = await input.resolve({\n method: \"GET\",\n uri: track.uri,\n });\n\n if (!resGet) return [...acc, track];\n\n const resHead = \"stream\" in resGet ? undefined : await input.resolve({\n method: \"HEAD\",\n uri: track.uri,\n });\n\n const { stats, tags } = await metadataProcessor.supply({\n stream: \"stream\" in resGet ? resGet.stream : undefined,\n urls: \"url\" in resGet\n ? {\n get: resGet.url,\n head: resHead && \"url\" in resHead ? resHead.url : resGet.url,\n }\n : undefined,\n });\n\n return [...acc, { ...track, stats, tags }];\n },\n Promise.resolve([]),\n );\n\n // Changed?\n const diff = deepDiff.diff(tracksWithMetadata, cachedTracks);\n const changed = !!diff;\n\n // Save if changed\n if (changed) return tracksWithMetadata;\n return null;\n}\n\n////////////////////////////////////////////\n// ⚡️\n////////////////////////////////////////////\n\nostiary((port) => {\n define(\"process\", process, port);\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,eAAsB,QAAQ,MAAM;AAClC,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,eAAe,KAAK;AAG1B,QAAM,gBAAgB,cAAc,aAAa;AACjD,QAAM,QAAQ,cAAc,MAAM,KAAK;AAGvC,QAAM,4BAA4B,cAAc,CAAC,QAAQ,CAAC;AAC1D,QAAM,oBAAoB,0BAA0B,MAAM,iBAAiB;AAE3E,QAAM,MAAM,MAAM;AAClB,QAAM,kBAAkB,MAAM;AAG9B,QAAM,MAAM,cAAc,YAAY;AAGtC,QAAM,SAAS,MAAM,MAAM,KAAK,YAAY;AAG5C,QAAM,qBAAqB,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKtC,OAAO,SAAS,UAAU;AACxB,YAAM,MAAM,MAAM;AAElB,UAAI,MAAM,QAAQ,MAAM,MAAO,QAAO,CAAC,GAAG,KAAK,KAAK;AAEpD,YAAM,SAAS,MAAM,MAAM,QAAQ;AAAA,QACjC,QAAQ;AAAA,QACR,KAAK,MAAM;AAAA,MACb,CAAC;AAED,UAAI,CAAC,OAAQ,QAAO,CAAC,GAAG,KAAK,KAAK;AAElC,YAAM,UAAU,YAAY,SAAS,SAAY,MAAM,MAAM,QAAQ;AAAA,QACnE,QAAQ;AAAA,QACR,KAAK,MAAM;AAAA,MACb,CAAC;AAED,YAAM,EAAE,OAAO,KAAK,IAAI,MAAM,kBAAkB,OAAO;AAAA,QACrD,QAAQ,YAAY,SAAS,OAAO,SAAS;AAAA,QAC7C,MAAM,SAAS,SACX;AAAA,UACA,KAAK,OAAO;AAAA,UACZ,MAAM,WAAW,SAAS,UAAU,QAAQ,MAAM,OAAO;AAAA,QAC3D,IACE;AAAA,MACN,CAAC;AAED,aAAO,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,OAAO,KAAK,CAAC;AAAA,IAC3C;AAAA,IACA,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACpB;AAGA,QAAM,OAAO,kBAAS,KAAK,oBAAoB,YAAY;AAC3D,QAAM,UAAU,CAAC,CAAC;AAGlB,MAAI,QAAS,QAAO;AACpB,SAAO;AACT;AAlEsB;AAwEtB,QAAQ,CAAC,SAAS;AAChB,SAAO,WAAW,SAAS,IAAI;AACjC,CAAC;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/orchestrator/process-tracks/worker.js.map"}
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-audio/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-audio/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-BSW55ML6.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-audio/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-audio/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/orchestrator/queue-audio/element.js.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-tracks/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-tracks/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-A3VEGVMA.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-tracks/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/queue-tracks/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/orchestrator/queue-tracks/element.js.map
+59
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/search-tracks/element.js
+59
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/search-tracks/element.js
···
1
+
import {
2
+
DiffuseElement,
3
+
query
4
+
} from "../../../chunk-GULCWZMN.js";
5
+
import "../../../chunk-SR6AOZ6U.js";
6
+
import "../../../chunk-LGHY5MKC.js";
7
+
import {
8
+
__name
9
+
} from "../../../chunk-B2VGR7JE.js";
10
+
11
+
// components/orchestrator/search-tracks/element.js
12
+
var _SearchTracksOrchestrator = class _SearchTracksOrchestrator extends DiffuseElement {
13
+
constructor() {
14
+
super();
15
+
this.input = query(this, "input-selector");
16
+
this.output = query(this, "output-selector");
17
+
this.search = query(this, "search-processor-selector");
18
+
}
19
+
// LIFECYCLE
20
+
/**
21
+
* @override
22
+
*/
23
+
async connectedCallback() {
24
+
super.connectedCallback();
25
+
await customElements.whenDefined(this.output.localName);
26
+
this.effect(() => {
27
+
const tracks = this.output.tracks.collection().filter(
28
+
(t) => t.kind !== "placeholder"
29
+
);
30
+
this.supplyAvailable(tracks);
31
+
});
32
+
}
33
+
// 🚛
34
+
/**
35
+
* @param {Track[]} cachedTracks
36
+
*/
37
+
async supplyAvailable(cachedTracks) {
38
+
const groups = await this.input.groupConsult(cachedTracks);
39
+
let availableTracks = [];
40
+
Object.values(groups).forEach((value) => {
41
+
if (value.available === false) return;
42
+
availableTracks = availableTracks.concat(value.tracks);
43
+
}, []);
44
+
await this.search.supply(availableTracks);
45
+
}
46
+
};
47
+
__name(_SearchTracksOrchestrator, "SearchTracksOrchestrator");
48
+
var SearchTracksOrchestrator = _SearchTracksOrchestrator;
49
+
var element_default = SearchTracksOrchestrator;
50
+
var CLASS = SearchTracksOrchestrator;
51
+
var NAME = "do-search-tracks";
52
+
customElements.define(NAME, SearchTracksOrchestrator);
53
+
export {
54
+
CLASS,
55
+
NAME,
56
+
element_default as default
57
+
};
58
+
59
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/search-tracks/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/orchestrator/search-tracks/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/orchestrator/search-tracks/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/common.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/output/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/common.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/output/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/constants.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/output/polymorphic/indexed-db/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/constants.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/constants.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/output/polymorphic/indexed-db/constants.js.map
+17
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/element.js
+17
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../../chunk-M4KBNR7K.js";
6
+
import "../../../../chunk-QQLIOIYP.js";
7
+
import "../../../../chunk-GULCWZMN.js";
8
+
import "../../../../chunk-SR6AOZ6U.js";
9
+
import "../../../../chunk-LGHY5MKC.js";
10
+
import "../../../../chunk-B2VGR7JE.js";
11
+
export {
12
+
CLASS,
13
+
NAME,
14
+
element_default as default
15
+
};
16
+
17
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/output/polymorphic/indexed-db/element.js.map
+44
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/worker.js
+44
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/worker.js
···
1
+
import {
2
+
IDB_PREFIX
3
+
} from "../../../../chunk-SPIQ6DSS.js";
4
+
import {
5
+
get,
6
+
set
7
+
} from "../../../../chunk-JMCNYZY6.js";
8
+
import {
9
+
define,
10
+
ostiary
11
+
} from "../../../../chunk-SR6AOZ6U.js";
12
+
import "../../../../chunk-LGHY5MKC.js";
13
+
import {
14
+
__name
15
+
} from "../../../../chunk-B2VGR7JE.js";
16
+
17
+
// components/output/polymorphic/indexed-db/worker.js
18
+
async function getTracks() {
19
+
const tracks = await get2({ name: "tracks.json" });
20
+
return tracks ?? [];
21
+
}
22
+
__name(getTracks, "getTracks");
23
+
async function putTracks(tracks) {
24
+
await put({ name: "tracks.json", data: tracks });
25
+
}
26
+
__name(putTracks, "putTracks");
27
+
ostiary((port) => {
28
+
define("getTracks", getTracks, port);
29
+
define("putTracks", putTracks, port);
30
+
});
31
+
async function get2({ name }) {
32
+
return await get(`${IDB_PREFIX}/${name}`);
33
+
}
34
+
__name(get2, "get");
35
+
async function put({ data, name }) {
36
+
return await set(`${IDB_PREFIX}/${name}`, data);
37
+
}
38
+
__name(put, "put");
39
+
export {
40
+
getTracks,
41
+
putTracks
42
+
};
43
+
44
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/output/polymorphic/indexed-db/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/output/polymorphic/indexed-db/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/constants.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/artwork/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/constants.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/constants.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/artwork/constants.js.map
+35
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/element.js
+35
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/element.js
···
1
+
import {
2
+
DiffuseElement
3
+
} from "../../../chunk-GULCWZMN.js";
4
+
import {
5
+
use
6
+
} from "../../../chunk-SR6AOZ6U.js";
7
+
import "../../../chunk-LGHY5MKC.js";
8
+
import {
9
+
__name
10
+
} from "../../../chunk-B2VGR7JE.js";
11
+
12
+
// components/processor/artwork/element.js
13
+
var _ArtworkProcessor = class _ArtworkProcessor extends DiffuseElement {
14
+
constructor() {
15
+
super();
16
+
const name = `diffuse/processor/metadata/${this.group}`;
17
+
const url = new URL("./worker.js", import.meta.url);
18
+
const worker = new Worker(url, { name, type: "module" });
19
+
this.artwork = use("artwork", worker);
20
+
this.supply = use("supply", worker);
21
+
}
22
+
};
23
+
__name(_ArtworkProcessor, "ArtworkProcessor");
24
+
var ArtworkProcessor = _ArtworkProcessor;
25
+
var element_default = ArtworkProcessor;
26
+
var CLASS = ArtworkProcessor;
27
+
var NAME = "dp-artwork";
28
+
customElements.define(NAME, ArtworkProcessor);
29
+
export {
30
+
CLASS,
31
+
NAME,
32
+
element_default as default
33
+
};
34
+
35
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/artwork/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/worker.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/worker.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/artwork/worker.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/artwork/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/artwork/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/common.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/metadata/common.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/common.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/common.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/metadata/common.js.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-3HGKPWGP.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/metadata/element.js.map
+40
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/worker.js
+40
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/worker.js
···
1
+
import {
2
+
musicMetadataTags
3
+
} from "../../../chunk-YPPYTUB4.js";
4
+
import "../../../chunk-2KLIGTMI.js";
5
+
import "../../../chunk-22H6P5CP.js";
6
+
import "../../../chunk-4GRJPARV.js";
7
+
import "../../../chunk-46FQFG3U.js";
8
+
import "../../../chunk-4BP3OKIA.js";
9
+
import {
10
+
define,
11
+
ostiary
12
+
} from "../../../chunk-SR6AOZ6U.js";
13
+
import "../../../chunk-LGHY5MKC.js";
14
+
import {
15
+
__name
16
+
} from "../../../chunk-B2VGR7JE.js";
17
+
18
+
// components/processor/metadata/worker.js
19
+
async function supply(args) {
20
+
return await musicMetadataTags(args).catch(
21
+
/**
22
+
* @param {Error} err
23
+
* @returns {Extraction}
24
+
*/
25
+
(err) => {
26
+
console.warn("Metadata processor error:", err);
27
+
console.log(args);
28
+
return {};
29
+
}
30
+
);
31
+
}
32
+
__name(supply, "supply");
33
+
ostiary((port) => {
34
+
define("supply", supply, port);
35
+
});
36
+
export {
37
+
supply
38
+
};
39
+
40
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/metadata/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/metadata/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/constants.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/search/constants.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/constants.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/constants.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/search/constants.js.map
+45
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/element.js
+45
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/element.js
···
1
+
import {
2
+
DiffuseElement
3
+
} from "../../../chunk-GULCWZMN.js";
4
+
import {
5
+
use
6
+
} from "../../../chunk-SR6AOZ6U.js";
7
+
import "../../../chunk-LGHY5MKC.js";
8
+
import {
9
+
__name
10
+
} from "../../../chunk-B2VGR7JE.js";
11
+
12
+
// components/processor/search/element.js
13
+
var _SearchProcessor = class _SearchProcessor extends DiffuseElement {
14
+
constructor() {
15
+
super();
16
+
const name = `diffuse/processor/search/${this.group}`;
17
+
const url = import.meta.resolve(
18
+
"./components/processor/search/worker.js"
19
+
);
20
+
let port;
21
+
if (this.hasAttribute("group")) {
22
+
const worker = new SharedWorker(url, { name, type: "module" });
23
+
port = worker.port;
24
+
port.start();
25
+
} else {
26
+
const worker = new Worker(url, { name, type: "module" });
27
+
port = worker;
28
+
}
29
+
this.search = use("search", port);
30
+
this.supply = use("supply", port);
31
+
}
32
+
};
33
+
__name(_SearchProcessor, "SearchProcessor");
34
+
var SearchProcessor = _SearchProcessor;
35
+
var element_default = SearchProcessor;
36
+
var CLASS = SearchProcessor;
37
+
var NAME = "dp-search";
38
+
customElements.define(NAME, SearchProcessor);
39
+
export {
40
+
CLASS,
41
+
NAME,
42
+
element_default as default
43
+
};
44
+
45
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/search/element.js.map
+4271
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/worker.js
+4271
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/worker.js
···
1
+
import {
2
+
SCHEMA
3
+
} from "../../../chunk-IAK2ZZZ5.js";
4
+
import {
5
+
define,
6
+
ostiary,
7
+
xxh32
8
+
} from "../../../chunk-SR6AOZ6U.js";
9
+
import {
10
+
signal
11
+
} from "../../../chunk-LGHY5MKC.js";
12
+
import {
13
+
__name
14
+
} from "../../../chunk-B2VGR7JE.js";
15
+
16
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/tokenizer/languages.ts
17
+
var STEMMERS = {
18
+
arabic: "ar",
19
+
armenian: "am",
20
+
bulgarian: "bg",
21
+
danish: "dk",
22
+
dutch: "nl",
23
+
english: "en",
24
+
finnish: "fi",
25
+
french: "fr",
26
+
german: "de",
27
+
greek: "gr",
28
+
hungarian: "hu",
29
+
indian: "in",
30
+
indonesian: "id",
31
+
irish: "ie",
32
+
italian: "it",
33
+
lithuanian: "lt",
34
+
nepali: "np",
35
+
norwegian: "no",
36
+
portuguese: "pt",
37
+
romanian: "ro",
38
+
russian: "ru",
39
+
serbian: "rs",
40
+
slovenian: "ru",
41
+
spanish: "es",
42
+
swedish: "se",
43
+
tamil: "ta",
44
+
turkish: "tr",
45
+
ukrainian: "uk",
46
+
sanskrit: "sk"
47
+
};
48
+
var SPLITTERS = {
49
+
dutch: /[^A-Za-zàèéìòóù0-9_'-]+/gim,
50
+
english: /[^A-Za-zàèéìòóù0-9_'-]+/gim,
51
+
french: /[^a-z0-9äâàéèëêïîöôùüûœç-]+/gim,
52
+
italian: /[^A-Za-zàèéìòóù0-9_'-]+/gim,
53
+
norwegian: /[^a-z0-9_æøåÆØÅäÄöÖüÜ]+/gim,
54
+
portuguese: /[^a-z0-9à-úÀ-Ú]/gim,
55
+
russian: /[^a-z0-9а-яА-ЯёЁ]+/gim,
56
+
spanish: /[^a-z0-9A-Zá-úÁ-ÚñÑüÜ]+/gim,
57
+
swedish: /[^a-z0-9_åÅäÄöÖüÜ-]+/gim,
58
+
german: /[^a-z0-9A-ZäöüÄÖÜß]+/gim,
59
+
finnish: /[^a-z0-9äöÄÖ]+/gim,
60
+
danish: /[^a-z0-9æøåÆØÅ]+/gim,
61
+
hungarian: /[^a-z0-9áéíóöőúüűÁÉÍÓÖŐÚÜŰ]+/gim,
62
+
romanian: /[^a-z0-9ăâîșțĂÂÎȘȚ]+/gim,
63
+
serbian: /[^a-z0-9čćžšđČĆŽŠĐ]+/gim,
64
+
turkish: /[^a-z0-9çÇğĞıİöÖşŞüÜ]+/gim,
65
+
lithuanian: /[^a-z0-9ąčęėįšųūžĄČĘĖĮŠŲŪŽ]+/gim,
66
+
arabic: /[^a-z0-9أ-ي]+/gim,
67
+
nepali: /[^a-z0-9अ-ह]+/gim,
68
+
irish: /[^a-z0-9áéíóúÁÉÍÓÚ]+/gim,
69
+
indian: /[^a-z0-9अ-ह]+/gim,
70
+
armenian: /[^a-z0-9ա-ֆ]+/gim,
71
+
greek: /[^a-z0-9α-ωά-ώ]+/gim,
72
+
indonesian: /[^a-z0-9]+/gim,
73
+
ukrainian: /[^a-z0-9а-яА-ЯіїєІЇЄ]+/gim,
74
+
slovenian: /[^a-z0-9螚ȎŠ]+/gim,
75
+
bulgarian: /[^a-z0-9а-яА-Я]+/gim,
76
+
tamil: /[^a-z0-9அ-ஹ]+/gim,
77
+
sanskrit: /[^a-z0-9A-Zāīūṛḷṃṁḥśṣṭḍṇṅñḻḹṝ]+/gim
78
+
};
79
+
var SUPPORTED_LANGUAGES = Object.keys(STEMMERS);
80
+
function getLocale(language) {
81
+
return language !== void 0 && SUPPORTED_LANGUAGES.includes(language) ? STEMMERS[language] : void 0;
82
+
}
83
+
__name(getLocale, "getLocale");
84
+
85
+
// https:https://jsr.io/@orama/orama/2.0.6/src/utils.ts
86
+
var baseId = Date.now().toString().slice(5);
87
+
var lastId = 0;
88
+
var nano = BigInt(1e3);
89
+
var milli = BigInt(1e6);
90
+
var second = BigInt(1e9);
91
+
var MAX_ARGUMENT_FOR_STACK = 65535;
92
+
function safeArrayPush(arr, newArr) {
93
+
if (newArr.length < MAX_ARGUMENT_FOR_STACK) {
94
+
Array.prototype.push.apply(arr, newArr);
95
+
} else {
96
+
for (let i = 0; i < newArr.length; i += MAX_ARGUMENT_FOR_STACK) {
97
+
Array.prototype.push.apply(arr, newArr.slice(i, i + MAX_ARGUMENT_FOR_STACK));
98
+
}
99
+
}
100
+
}
101
+
__name(safeArrayPush, "safeArrayPush");
102
+
function sprintf(template, ...args) {
103
+
return template.replace(/%(?:(?<position>\d+)\$)?(?<width>-?\d*\.?\d*)(?<type>[dfs])/g, function(...replaceArgs) {
104
+
const groups = replaceArgs[replaceArgs.length - 1];
105
+
const { width: rawWidth, type, position } = groups;
106
+
const replacement = position ? args[Number.parseInt(position) - 1] : args.shift();
107
+
const width = rawWidth === "" ? 0 : Number.parseInt(rawWidth);
108
+
switch (type) {
109
+
case "d":
110
+
return replacement.toString().padStart(width, "0");
111
+
case "f": {
112
+
let value = replacement;
113
+
const [padding, precision] = rawWidth.split(".").map((w) => Number.parseFloat(w));
114
+
if (typeof precision === "number" && precision >= 0) {
115
+
value = value.toFixed(precision);
116
+
}
117
+
return typeof padding === "number" && padding >= 0 ? value.toString().padStart(width, "0") : value.toString();
118
+
}
119
+
case "s":
120
+
return width < 0 ? replacement.toString().padEnd(-width, " ") : replacement.toString().padStart(width, " ");
121
+
default:
122
+
return replacement;
123
+
}
124
+
});
125
+
}
126
+
__name(sprintf, "sprintf");
127
+
function isInsideWebWorker() {
128
+
return typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope;
129
+
}
130
+
__name(isInsideWebWorker, "isInsideWebWorker");
131
+
function isInsideNode() {
132
+
return typeof process !== "undefined" && process.release && process.release.name === "node";
133
+
}
134
+
__name(isInsideNode, "isInsideNode");
135
+
function getNanosecondTimeViaPerformance() {
136
+
return BigInt(Math.floor(performance.now() * 1e6));
137
+
}
138
+
__name(getNanosecondTimeViaPerformance, "getNanosecondTimeViaPerformance");
139
+
async function formatNanoseconds(value) {
140
+
if (typeof value === "number") {
141
+
value = BigInt(value);
142
+
}
143
+
if (value < nano) {
144
+
return `${value}ns`;
145
+
} else if (value < milli) {
146
+
return `${value / nano}\u03BCs`;
147
+
} else if (value < second) {
148
+
return `${value / milli}ms`;
149
+
}
150
+
return `${value / second}s`;
151
+
}
152
+
__name(formatNanoseconds, "formatNanoseconds");
153
+
async function getNanosecondsTime() {
154
+
if (isInsideWebWorker()) {
155
+
return getNanosecondTimeViaPerformance();
156
+
}
157
+
if (isInsideNode()) {
158
+
return process.hrtime.bigint();
159
+
}
160
+
if (typeof process !== "undefined" && process.hrtime !== void 0) {
161
+
return process.hrtime.bigint();
162
+
}
163
+
if (typeof performance !== "undefined") {
164
+
return getNanosecondTimeViaPerformance();
165
+
}
166
+
return BigInt(0);
167
+
}
168
+
__name(getNanosecondsTime, "getNanosecondsTime");
169
+
async function uniqueId() {
170
+
return `${baseId}-${lastId++}`;
171
+
}
172
+
__name(uniqueId, "uniqueId");
173
+
function getOwnProperty(object, property) {
174
+
if (Object.hasOwn === void 0) {
175
+
return Object.prototype.hasOwnProperty.call(object, property) ? object[property] : void 0;
176
+
}
177
+
return Object.hasOwn(object, property) ? object[property] : void 0;
178
+
}
179
+
__name(getOwnProperty, "getOwnProperty");
180
+
function sortTokenScorePredicate(a, b) {
181
+
if (b[1] === a[1]) {
182
+
return a[0] - b[0];
183
+
}
184
+
return b[1] - a[1];
185
+
}
186
+
__name(sortTokenScorePredicate, "sortTokenScorePredicate");
187
+
function intersect(arrays) {
188
+
if (arrays.length === 0) {
189
+
return [];
190
+
} else if (arrays.length === 1) {
191
+
return arrays[0];
192
+
}
193
+
for (let i = 1; i < arrays.length; i++) {
194
+
if (arrays[i].length < arrays[0].length) {
195
+
const tmp = arrays[0];
196
+
arrays[0] = arrays[i];
197
+
arrays[i] = tmp;
198
+
}
199
+
}
200
+
const set = /* @__PURE__ */ new Map();
201
+
for (const elem of arrays[0]) {
202
+
set.set(elem, 1);
203
+
}
204
+
for (let i = 1; i < arrays.length; i++) {
205
+
let found = 0;
206
+
for (const elem of arrays[i]) {
207
+
const count3 = set.get(elem);
208
+
if (count3 === i) {
209
+
set.set(elem, count3 + 1);
210
+
found++;
211
+
}
212
+
}
213
+
if (found === 0) return [];
214
+
}
215
+
return arrays[0].filter((e) => {
216
+
const count3 = set.get(e);
217
+
if (count3 !== void 0) set.set(e, 0);
218
+
return count3 === arrays.length;
219
+
});
220
+
}
221
+
__name(intersect, "intersect");
222
+
async function getDocumentProperties(doc, paths) {
223
+
const properties = {};
224
+
const pathsLength = paths.length;
225
+
for (let i = 0; i < pathsLength; i++) {
226
+
const path = paths[i];
227
+
const pathTokens = path.split(".");
228
+
let current = doc;
229
+
const pathTokensLength = pathTokens.length;
230
+
for (let j = 0; j < pathTokensLength; j++) {
231
+
current = current[pathTokens[j]];
232
+
if (typeof current === "object") {
233
+
if (current !== null && "lat" in current && "lon" in current && typeof current.lat === "number" && typeof current.lon === "number") {
234
+
current = properties[path] = current;
235
+
break;
236
+
} else if (!Array.isArray(current) && current !== null && j === pathTokensLength - 1) {
237
+
current = void 0;
238
+
break;
239
+
}
240
+
} else if ((current === null || typeof current !== "object") && j < pathTokensLength - 1) {
241
+
current = void 0;
242
+
break;
243
+
}
244
+
}
245
+
if (typeof current !== "undefined") {
246
+
properties[path] = current;
247
+
}
248
+
}
249
+
return properties;
250
+
}
251
+
__name(getDocumentProperties, "getDocumentProperties");
252
+
async function getNested(obj, path) {
253
+
const props = await getDocumentProperties(obj, [
254
+
path
255
+
]);
256
+
return props[path];
257
+
}
258
+
__name(getNested, "getNested");
259
+
var mapDistanceToMeters = {
260
+
cm: 0.01,
261
+
m: 1,
262
+
km: 1e3,
263
+
ft: 0.3048,
264
+
yd: 0.9144,
265
+
mi: 1609.344
266
+
};
267
+
function convertDistanceToMeters(distance, unit) {
268
+
const ratio = mapDistanceToMeters[unit];
269
+
if (ratio === void 0) {
270
+
throw new Error(createError("INVALID_DISTANCE_SUFFIX", distance).message);
271
+
}
272
+
return distance * ratio;
273
+
}
274
+
__name(convertDistanceToMeters, "convertDistanceToMeters");
275
+
function removeVectorsFromHits(searchResult, vectorProperties) {
276
+
searchResult.hits = searchResult.hits.map((result) => ({
277
+
...result,
278
+
document: {
279
+
...result.document,
280
+
// Remove embeddings from the result
281
+
...vectorProperties.reduce((acc, prop) => {
282
+
const path = prop.split(".");
283
+
const lastKey = path.pop();
284
+
let obj = acc;
285
+
for (const key of path) {
286
+
obj[key] = obj[key] ?? {};
287
+
obj = obj[key];
288
+
}
289
+
obj[lastKey] = null;
290
+
return acc;
291
+
}, result.document)
292
+
}
293
+
}));
294
+
}
295
+
__name(removeVectorsFromHits, "removeVectorsFromHits");
296
+
297
+
// https:https://jsr.io/@orama/orama/2.0.6/src/errors.ts
298
+
var allLanguages = SUPPORTED_LANGUAGES.join("\n - ");
299
+
var errors = {
300
+
NO_LANGUAGE_WITH_CUSTOM_TOKENIZER: "Do not pass the language option to create when using a custom tokenizer.",
301
+
LANGUAGE_NOT_SUPPORTED: `Language "%s" is not supported.
302
+
Supported languages are:
303
+
- ${allLanguages}`,
304
+
INVALID_STEMMER_FUNCTION_TYPE: `config.stemmer property must be a function.`,
305
+
MISSING_STEMMER: `As of version 1.0.0 @orama/orama does not ship non English stemmers by default. To solve this, please explicitly import and specify the "%s" stemmer from the package @orama/stemmers. See https://docs.oramasearch.com/open-source/text-analysis/stemming for more information.`,
306
+
CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY: "Custom stop words array must only contain strings.",
307
+
UNSUPPORTED_COMPONENT: `Unsupported component "%s".`,
308
+
COMPONENT_MUST_BE_FUNCTION: `The component "%s" must be a function.`,
309
+
COMPONENT_MUST_BE_FUNCTION_OR_ARRAY_FUNCTIONS: `The component "%s" must be a function or an array of functions.`,
310
+
INVALID_SCHEMA_TYPE: `Unsupported schema type "%s" at "%s". Expected "string", "boolean" or "number" or array of them.`,
311
+
DOCUMENT_ID_MUST_BE_STRING: `Document id must be of type "string". Got "%s" instead.`,
312
+
DOCUMENT_ALREADY_EXISTS: `A document with id "%s" already exists.`,
313
+
DOCUMENT_DOES_NOT_EXIST: `A document with id "%s" does not exists.`,
314
+
MISSING_DOCUMENT_PROPERTY: `Missing searchable property "%s".`,
315
+
INVALID_DOCUMENT_PROPERTY: `Invalid document property "%s": expected "%s", got "%s"`,
316
+
UNKNOWN_INDEX: `Invalid property name "%s". Expected a wildcard string ("*") or array containing one of the following properties: %s`,
317
+
INVALID_BOOST_VALUE: `Boost value must be a number greater than, or less than 0.`,
318
+
INVALID_FILTER_OPERATION: `You can only use one operation per filter, you requested %d.`,
319
+
SCHEMA_VALIDATION_FAILURE: `Cannot insert document due schema validation failure on "%s" property.`,
320
+
INVALID_SORT_SCHEMA_TYPE: `Unsupported sort schema type "%s" at "%s". Expected "string" or "number".`,
321
+
CANNOT_SORT_BY_ARRAY: `Cannot configure sort for "%s" because it is an array (%s).`,
322
+
UNABLE_TO_SORT_ON_UNKNOWN_FIELD: `Unable to sort on unknown field "%s". Allowed fields: %s`,
323
+
SORT_DISABLED: `Sort is disabled. Please read the documentation at https://docs.oramasearch for more information.`,
324
+
UNKNOWN_GROUP_BY_PROPERTY: `Unknown groupBy property "%s".`,
325
+
INVALID_GROUP_BY_PROPERTY: `Invalid groupBy property "%s". Allowed types: "%s", but given "%s".`,
326
+
UNKNOWN_FILTER_PROPERTY: `Unknown filter property "%s".`,
327
+
INVALID_VECTOR_SIZE: `Vector size must be a number greater than 0. Got "%s" instead.`,
328
+
INVALID_VECTOR_VALUE: `Vector value must be a number greater than 0. Got "%s" instead.`,
329
+
INVALID_INPUT_VECTOR: `Property "%s" was declared as a %s-dimensional vector, but got a %s-dimensional vector instead.
330
+
Input vectors must be of the size declared in the schema, as calculating similarity between vectors of different sizes can lead to unexpected results.`,
331
+
WRONG_SEARCH_PROPERTY_TYPE: `Property "%s" is not searchable. Only "string" properties are searchable.`,
332
+
FACET_NOT_SUPPORTED: `Facet doens't support the type "%s".`,
333
+
INVALID_DISTANCE_SUFFIX: `Invalid distance suffix "%s". Valid suffixes are: cm, m, km, mi, yd, ft.`,
334
+
INVALID_SEARCH_MODE: `Invalid search mode "%s". Valid modes are: "fulltext", "vector", "hybrid".`,
335
+
MISSING_VECTOR_AND_SECURE_PROXY: `No vector was provided and no secure proxy was configured. Please provide a vector or configure an Orama Secure Proxy to perform hybrid search.`,
336
+
MISSING_TERM: `"term" is a required parameter when performing hybrid search. Please provide a search term.`,
337
+
INVALID_VECTOR_INPUT: `Invalid "vector" property. Expected an object with "value" and "property" properties, but got "%s" instead.`,
338
+
PLUGIN_CRASHED: `A plugin crashed during initialization. Please check the error message for more information:`
339
+
};
340
+
function createError(code, ...args) {
341
+
const error = new Error(sprintf(errors[code] ?? `Unsupported Orama Error code: ${code}`, ...args));
342
+
error.code = code;
343
+
if ("captureStackTrace" in Error.prototype) {
344
+
Error.captureStackTrace(error);
345
+
}
346
+
return error;
347
+
}
348
+
__name(createError, "createError");
349
+
350
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/defaults.ts
351
+
async function formatElapsedTime(n) {
352
+
return {
353
+
raw: Number(n),
354
+
formatted: await formatNanoseconds(n)
355
+
};
356
+
}
357
+
__name(formatElapsedTime, "formatElapsedTime");
358
+
async function getDocumentIndexId(doc) {
359
+
if (doc.id) {
360
+
if (typeof doc.id !== "string") {
361
+
throw createError("DOCUMENT_ID_MUST_BE_STRING", typeof doc.id);
362
+
}
363
+
return doc.id;
364
+
}
365
+
return await uniqueId();
366
+
}
367
+
__name(getDocumentIndexId, "getDocumentIndexId");
368
+
async function validateSchema(doc, schema) {
369
+
for (const [prop, type] of Object.entries(schema)) {
370
+
const value = doc[prop];
371
+
if (typeof value === "undefined") {
372
+
continue;
373
+
}
374
+
if (type === "geopoint" && typeof value === "object" && typeof value.lon === "number" && typeof value.lat === "number") {
375
+
continue;
376
+
}
377
+
if (type === "enum" && (typeof value === "string" || typeof value === "number")) {
378
+
continue;
379
+
}
380
+
if (type === "enum[]" && Array.isArray(value)) {
381
+
const valueLength = value.length;
382
+
for (let i = 0; i < valueLength; i++) {
383
+
if (typeof value[i] !== "string" && typeof value[i] !== "number") {
384
+
return prop + "." + i;
385
+
}
386
+
}
387
+
continue;
388
+
}
389
+
if (isVectorType(type)) {
390
+
const vectorSize = getVectorSize(type);
391
+
if (!Array.isArray(value) || value.length !== vectorSize) {
392
+
throw createError("INVALID_INPUT_VECTOR", prop, vectorSize, value.length);
393
+
}
394
+
continue;
395
+
}
396
+
if (isArrayType(type)) {
397
+
if (!Array.isArray(value)) {
398
+
return prop;
399
+
}
400
+
const expectedType = getInnerType(type);
401
+
const valueLength = value.length;
402
+
for (let i = 0; i < valueLength; i++) {
403
+
if (typeof value[i] !== expectedType) {
404
+
return prop + "." + i;
405
+
}
406
+
}
407
+
continue;
408
+
}
409
+
if (typeof type === "object") {
410
+
if (!value || typeof value !== "object") {
411
+
return prop;
412
+
}
413
+
const subProp = await validateSchema(value, type);
414
+
if (subProp) {
415
+
return prop + "." + subProp;
416
+
}
417
+
continue;
418
+
}
419
+
if (typeof value !== type) {
420
+
return prop;
421
+
}
422
+
}
423
+
return void 0;
424
+
}
425
+
__name(validateSchema, "validateSchema");
426
+
var IS_ARRAY_TYPE = {
427
+
string: false,
428
+
number: false,
429
+
boolean: false,
430
+
enum: false,
431
+
geopoint: false,
432
+
"string[]": true,
433
+
"number[]": true,
434
+
"boolean[]": true,
435
+
"enum[]": true
436
+
};
437
+
var INNER_TYPE = {
438
+
"string[]": "string",
439
+
"number[]": "number",
440
+
"boolean[]": "boolean",
441
+
"enum[]": "enum"
442
+
};
443
+
function isGeoPointType(type) {
444
+
return type === "geopoint";
445
+
}
446
+
__name(isGeoPointType, "isGeoPointType");
447
+
function isVectorType(type) {
448
+
return typeof type === "string" && /^vector\[\d+\]$/.test(type);
449
+
}
450
+
__name(isVectorType, "isVectorType");
451
+
function isArrayType(type) {
452
+
return typeof type === "string" && IS_ARRAY_TYPE[type];
453
+
}
454
+
__name(isArrayType, "isArrayType");
455
+
function getInnerType(type) {
456
+
return INNER_TYPE[type];
457
+
}
458
+
__name(getInnerType, "getInnerType");
459
+
function getVectorSize(type) {
460
+
const size = Number(type.slice(7, -1));
461
+
switch (true) {
462
+
case isNaN(size):
463
+
throw createError("INVALID_VECTOR_VALUE", type);
464
+
case size <= 0:
465
+
throw createError("INVALID_VECTOR_SIZE", type);
466
+
default:
467
+
return size;
468
+
}
469
+
}
470
+
__name(getVectorSize, "getVectorSize");
471
+
472
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/internal-document-id-store.ts
473
+
function createInternalDocumentIDStore() {
474
+
return {
475
+
idToInternalId: /* @__PURE__ */ new Map(),
476
+
internalIdToId: [],
477
+
save,
478
+
load
479
+
};
480
+
}
481
+
__name(createInternalDocumentIDStore, "createInternalDocumentIDStore");
482
+
function save(store2) {
483
+
return {
484
+
internalIdToId: store2.internalIdToId
485
+
};
486
+
}
487
+
__name(save, "save");
488
+
function load(orama, raw) {
489
+
const { internalIdToId } = raw;
490
+
orama.internalDocumentIDStore.idToInternalId.clear();
491
+
orama.internalDocumentIDStore.internalIdToId = [];
492
+
for (let i = 0; i < internalIdToId.length; i++) {
493
+
orama.internalDocumentIDStore.idToInternalId.set(internalIdToId[i], i + 1);
494
+
orama.internalDocumentIDStore.internalIdToId.push(internalIdToId[i]);
495
+
}
496
+
}
497
+
__name(load, "load");
498
+
function getInternalDocumentId(store2, id) {
499
+
if (typeof id === "string") {
500
+
const internalId = store2.idToInternalId.get(id);
501
+
if (internalId) {
502
+
return internalId;
503
+
}
504
+
const currentId = store2.idToInternalId.size + 1;
505
+
store2.idToInternalId.set(id, currentId);
506
+
store2.internalIdToId.push(id);
507
+
return currentId;
508
+
}
509
+
if (id > store2.internalIdToId.length) {
510
+
return getInternalDocumentId(store2, id.toString());
511
+
}
512
+
return id;
513
+
}
514
+
__name(getInternalDocumentId, "getInternalDocumentId");
515
+
function getDocumentIdFromInternalId(store2, internalId) {
516
+
if (store2.internalIdToId.length < internalId) {
517
+
throw new Error(`Invalid internalId ${internalId}`);
518
+
}
519
+
return store2.internalIdToId[internalId - 1];
520
+
}
521
+
__name(getDocumentIdFromInternalId, "getDocumentIdFromInternalId");
522
+
523
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/documents-store.ts
524
+
async function create(_, sharedInternalDocumentStore) {
525
+
return {
526
+
sharedInternalDocumentStore,
527
+
docs: {},
528
+
count: 0
529
+
};
530
+
}
531
+
__name(create, "create");
532
+
async function get(store2, id) {
533
+
const internalId = getInternalDocumentId(store2.sharedInternalDocumentStore, id);
534
+
return store2.docs[internalId];
535
+
}
536
+
__name(get, "get");
537
+
async function getMultiple(store2, ids) {
538
+
const found = Array.from({
539
+
length: ids.length
540
+
});
541
+
for (let i = 0; i < ids.length; i++) {
542
+
const internalId = getInternalDocumentId(store2.sharedInternalDocumentStore, ids[i]);
543
+
found[i] = store2.docs[internalId];
544
+
}
545
+
return found;
546
+
}
547
+
__name(getMultiple, "getMultiple");
548
+
async function getAll(store2) {
549
+
return store2.docs;
550
+
}
551
+
__name(getAll, "getAll");
552
+
async function store(store2, id, doc) {
553
+
const internalId = getInternalDocumentId(store2.sharedInternalDocumentStore, id);
554
+
if (typeof store2.docs[internalId] !== "undefined") {
555
+
return false;
556
+
}
557
+
store2.docs[internalId] = doc;
558
+
store2.count++;
559
+
return true;
560
+
}
561
+
__name(store, "store");
562
+
async function remove(store2, id) {
563
+
const internalId = getInternalDocumentId(store2.sharedInternalDocumentStore, id);
564
+
if (typeof store2.docs[internalId] === "undefined") {
565
+
return false;
566
+
}
567
+
delete store2.docs[internalId];
568
+
store2.count--;
569
+
return true;
570
+
}
571
+
__name(remove, "remove");
572
+
async function count(store2) {
573
+
return store2.count;
574
+
}
575
+
__name(count, "count");
576
+
async function load2(sharedInternalDocumentStore, raw) {
577
+
const rawDocument = raw;
578
+
return {
579
+
docs: rawDocument.docs,
580
+
count: rawDocument.count,
581
+
sharedInternalDocumentStore
582
+
};
583
+
}
584
+
__name(load2, "load");
585
+
async function save2(store2) {
586
+
return {
587
+
docs: store2.docs,
588
+
count: store2.count
589
+
};
590
+
}
591
+
__name(save2, "save");
592
+
async function createDocumentsStore() {
593
+
return {
594
+
create,
595
+
get,
596
+
getMultiple,
597
+
getAll,
598
+
store,
599
+
remove,
600
+
count,
601
+
load: load2,
602
+
save: save2
603
+
};
604
+
}
605
+
__name(createDocumentsStore, "createDocumentsStore");
606
+
607
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/plugins.ts
608
+
var AVAILABLE_PLUGIN_HOOKS = [
609
+
"beforeInsert",
610
+
"afterInsert",
611
+
"beforeRemove",
612
+
"afterRemove",
613
+
"beforeUpdate",
614
+
"afterUpdate",
615
+
"beforeSearch",
616
+
"afterSearch",
617
+
"beforeInsertMultiple",
618
+
"afterInsertMultiple",
619
+
"beforeRemoveMultiple",
620
+
"afterRemoveMultiple",
621
+
"beforeUpdateMultiple",
622
+
"afterUpdateMultiple",
623
+
"beforeLoad",
624
+
"afterLoad"
625
+
];
626
+
async function getAllPluginsByHook(orama, hook) {
627
+
const pluginsToRun = [];
628
+
const pluginsLength = orama.plugins?.length;
629
+
if (!pluginsLength) {
630
+
return pluginsToRun;
631
+
}
632
+
for (let i = 0; i < pluginsLength; i++) {
633
+
try {
634
+
const plugin = await orama.plugins[i];
635
+
if (typeof plugin[hook] === "function") {
636
+
pluginsToRun.push(plugin[hook]);
637
+
}
638
+
} catch (error) {
639
+
console.error("Caught error in getAllPluginsByHook:", error);
640
+
throw createError("PLUGIN_CRASHED");
641
+
}
642
+
}
643
+
return pluginsToRun;
644
+
}
645
+
__name(getAllPluginsByHook, "getAllPluginsByHook");
646
+
647
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/hooks.ts
648
+
var OBJECT_COMPONENTS = [
649
+
"tokenizer",
650
+
"index",
651
+
"documentsStore",
652
+
"sorter"
653
+
];
654
+
var FUNCTION_COMPONENTS = [
655
+
"validateSchema",
656
+
"getDocumentIndexId",
657
+
"getDocumentProperties",
658
+
"formatElapsedTime"
659
+
];
660
+
async function runSingleHook(hooks, orama, id, doc) {
661
+
const hooksLength = hooks.length;
662
+
for (let i = 0; i < hooksLength; i++) {
663
+
await hooks[i](orama, id, doc);
664
+
}
665
+
}
666
+
__name(runSingleHook, "runSingleHook");
667
+
async function runMultipleHook(hooks, orama, docsOrIds) {
668
+
const hooksLength = hooks.length;
669
+
for (let i = 0; i < hooksLength; i++) {
670
+
await hooks[i](orama, docsOrIds);
671
+
}
672
+
}
673
+
__name(runMultipleHook, "runMultipleHook");
674
+
async function runAfterSearch(hooks, db2, params, language, results) {
675
+
const hooksLength = hooks.length;
676
+
for (let i = 0; i < hooksLength; i++) {
677
+
await hooks[i](db2, params, language, results);
678
+
}
679
+
}
680
+
__name(runAfterSearch, "runAfterSearch");
681
+
async function runBeforeSearch(hooks, db2, params, language) {
682
+
const hooksLength = hooks.length;
683
+
for (let i = 0; i < hooksLength; i++) {
684
+
await hooks[i](db2, params, language);
685
+
}
686
+
}
687
+
__name(runBeforeSearch, "runBeforeSearch");
688
+
689
+
// https:https://jsr.io/@orama/orama/2.0.6/src/trees/avl.ts
690
+
function rotateLeft(node) {
691
+
const right = node.r;
692
+
node.r = right.l;
693
+
right.l = node;
694
+
node.h = Math.max(getHeight(node.l), getHeight(node.r)) + 1;
695
+
right.h = Math.max(getHeight(right.l), getHeight(right.r)) + 1;
696
+
return right;
697
+
}
698
+
__name(rotateLeft, "rotateLeft");
699
+
function rotateRight(node) {
700
+
const left = node.l;
701
+
node.l = left.r;
702
+
left.r = node;
703
+
node.h = Math.max(getHeight(node.l), getHeight(node.r)) + 1;
704
+
left.h = Math.max(getHeight(left.l), getHeight(left.r)) + 1;
705
+
return left;
706
+
}
707
+
__name(rotateRight, "rotateRight");
708
+
function rangeSearch(node, min, max) {
709
+
const result = [];
710
+
function traverse(node2) {
711
+
if (node2 === null) {
712
+
return;
713
+
}
714
+
if (min < node2.k) {
715
+
traverse(node2.l);
716
+
}
717
+
if (node2.k >= min && node2.k <= max) {
718
+
safeArrayPush(result, node2.v);
719
+
}
720
+
if (max > node2.k) {
721
+
traverse(node2.r);
722
+
}
723
+
}
724
+
__name(traverse, "traverse");
725
+
traverse(node.root);
726
+
return result;
727
+
}
728
+
__name(rangeSearch, "rangeSearch");
729
+
function greaterThan(node, key, inclusive = false) {
730
+
const result = [];
731
+
function traverse(node2) {
732
+
if (node2 === null) {
733
+
return;
734
+
}
735
+
if (inclusive && node2.k >= key) {
736
+
safeArrayPush(result, node2.v);
737
+
}
738
+
if (!inclusive && node2.k > key) {
739
+
safeArrayPush(result, node2.v);
740
+
}
741
+
traverse(node2.l);
742
+
traverse(node2.r);
743
+
}
744
+
__name(traverse, "traverse");
745
+
traverse(node.root);
746
+
return result;
747
+
}
748
+
__name(greaterThan, "greaterThan");
749
+
function lessThan(node, key, inclusive = false) {
750
+
const result = [];
751
+
function traverse(node2) {
752
+
if (node2 === null) {
753
+
return;
754
+
}
755
+
if (inclusive && node2.k <= key) {
756
+
safeArrayPush(result, node2.v);
757
+
}
758
+
if (!inclusive && node2.k < key) {
759
+
safeArrayPush(result, node2.v);
760
+
}
761
+
traverse(node2.l);
762
+
traverse(node2.r);
763
+
}
764
+
__name(traverse, "traverse");
765
+
traverse(node.root);
766
+
return result;
767
+
}
768
+
__name(lessThan, "lessThan");
769
+
function getNodeByKey(node, key) {
770
+
while (node !== null) {
771
+
if (key < node.k) {
772
+
node = node.l;
773
+
} else if (key > node.k) {
774
+
node = node.r;
775
+
} else {
776
+
return node;
777
+
}
778
+
}
779
+
return null;
780
+
}
781
+
__name(getNodeByKey, "getNodeByKey");
782
+
function create2(key, value) {
783
+
return {
784
+
root: {
785
+
k: key,
786
+
v: value,
787
+
l: null,
788
+
r: null,
789
+
h: 0
790
+
}
791
+
};
792
+
}
793
+
__name(create2, "create");
794
+
function insert(rootNode, key, newValue) {
795
+
function insertNode(node, key2, newValue2) {
796
+
if (node === null) {
797
+
return {
798
+
k: key2,
799
+
v: newValue2,
800
+
l: null,
801
+
r: null,
802
+
h: 0
803
+
};
804
+
}
805
+
if (key2 < node.k) {
806
+
node.l = insertNode(node.l, key2, newValue2);
807
+
} else if (key2 > node.k) {
808
+
node.r = insertNode(node.r, key2, newValue2);
809
+
} else {
810
+
for (const value of newValue2) {
811
+
node.v.push(value);
812
+
}
813
+
return node;
814
+
}
815
+
node.h = 1 + Math.max(getHeight(node.l), getHeight(node.r));
816
+
const balanceFactor = getHeight(node.l) - getHeight(node.r);
817
+
if (balanceFactor > 1 && key2 < node.l.k) {
818
+
return rotateRight(node);
819
+
}
820
+
if (balanceFactor < -1 && key2 > node.r.k) {
821
+
return rotateLeft(node);
822
+
}
823
+
if (balanceFactor > 1 && key2 > node.l.k) {
824
+
node.l = rotateLeft(node.l);
825
+
return rotateRight(node);
826
+
}
827
+
if (balanceFactor < -1 && key2 < node.r.k) {
828
+
node.r = rotateRight(node.r);
829
+
return rotateLeft(node);
830
+
}
831
+
return node;
832
+
}
833
+
__name(insertNode, "insertNode");
834
+
rootNode.root = insertNode(rootNode.root, key, newValue);
835
+
}
836
+
__name(insert, "insert");
837
+
function getHeight(node) {
838
+
return node !== null ? node.h : -1;
839
+
}
840
+
__name(getHeight, "getHeight");
841
+
function find(root, key) {
842
+
const node = getNodeByKey(root.root, key);
843
+
if (node === null) {
844
+
return null;
845
+
}
846
+
return node.v;
847
+
}
848
+
__name(find, "find");
849
+
function remove2(rootNode, key) {
850
+
if (rootNode === null || rootNode.root === null) {
851
+
return;
852
+
}
853
+
let node = rootNode.root;
854
+
let parentNode = null;
855
+
while (node != null && node.k !== key) {
856
+
parentNode = node;
857
+
if (key < node.k) {
858
+
node = node.l;
859
+
} else {
860
+
node = node.r;
861
+
}
862
+
}
863
+
if (node === null) {
864
+
return;
865
+
}
866
+
const deleteNode = /* @__PURE__ */ __name(() => {
867
+
if (node.l === null && node.r === null) {
868
+
if (parentNode === null) {
869
+
rootNode.root = null;
870
+
} else {
871
+
if (parentNode.l === node) {
872
+
parentNode.l = null;
873
+
} else {
874
+
parentNode.r = null;
875
+
}
876
+
}
877
+
} else if (node.l != null && node.r != null) {
878
+
let minValueNode = node.r;
879
+
let minValueParent = node;
880
+
while (minValueNode.l != null) {
881
+
minValueParent = minValueNode;
882
+
minValueNode = minValueNode.l;
883
+
}
884
+
node.k = minValueNode.k;
885
+
if (minValueParent === node) {
886
+
minValueParent.r = minValueNode.r;
887
+
} else {
888
+
minValueParent.l = minValueNode.r;
889
+
}
890
+
} else {
891
+
const childNode = node.l != null ? node.l : node.r;
892
+
if (parentNode === null) {
893
+
rootNode.root = childNode;
894
+
} else {
895
+
if (parentNode.l === node) {
896
+
parentNode.l = childNode;
897
+
} else {
898
+
parentNode.r = childNode;
899
+
}
900
+
}
901
+
}
902
+
}, "deleteNode");
903
+
deleteNode();
904
+
}
905
+
__name(remove2, "remove");
906
+
function removeDocument(root, id, key) {
907
+
const node = getNodeByKey(root.root, key);
908
+
if (!node) {
909
+
return;
910
+
}
911
+
if (node.v.length === 1) {
912
+
remove2(root, key);
913
+
return;
914
+
}
915
+
node.v.splice(node.v.indexOf(id), 1);
916
+
}
917
+
__name(removeDocument, "removeDocument");
918
+
919
+
// https:https://jsr.io/@orama/orama/2.0.6/src/trees/flat.ts
920
+
function create3() {
921
+
return {
922
+
numberToDocumentId: /* @__PURE__ */ new Map()
923
+
};
924
+
}
925
+
__name(create3, "create");
926
+
function insert2(root, key, value) {
927
+
if (root.numberToDocumentId.has(key)) {
928
+
root.numberToDocumentId.get(key).push(value);
929
+
return root;
930
+
}
931
+
root.numberToDocumentId.set(key, [
932
+
value
933
+
]);
934
+
return root;
935
+
}
936
+
__name(insert2, "insert");
937
+
function removeDocument2(root, id, key) {
938
+
root?.numberToDocumentId.set(key, root?.numberToDocumentId.get(key)?.filter((v2) => v2 !== id) ?? []);
939
+
if (root?.numberToDocumentId.get(key)?.length === 0) {
940
+
root?.numberToDocumentId.delete(key);
941
+
}
942
+
}
943
+
__name(removeDocument2, "removeDocument");
944
+
function filter(root, operation) {
945
+
const operationKeys = Object.keys(operation);
946
+
if (operationKeys.length !== 1) {
947
+
throw new Error("Invalid operation");
948
+
}
949
+
const operationType = operationKeys[0];
950
+
switch (operationType) {
951
+
case "eq": {
952
+
const value = operation[operationType];
953
+
return root.numberToDocumentId.get(value) ?? [];
954
+
}
955
+
case "in": {
956
+
const value = operation[operationType];
957
+
const result = [];
958
+
for (const v2 of value) {
959
+
const ids = root.numberToDocumentId.get(v2);
960
+
if (ids != null) {
961
+
safeArrayPush(result, ids);
962
+
}
963
+
}
964
+
return result;
965
+
}
966
+
case "nin": {
967
+
const value = operation[operationType];
968
+
const result = [];
969
+
const keys = root.numberToDocumentId.keys();
970
+
for (const key of keys) {
971
+
if (value.includes(key)) {
972
+
continue;
973
+
}
974
+
const ids = root.numberToDocumentId.get(key);
975
+
if (ids != null) {
976
+
safeArrayPush(result, ids);
977
+
}
978
+
}
979
+
return result;
980
+
}
981
+
}
982
+
throw new Error("Invalid operation");
983
+
}
984
+
__name(filter, "filter");
985
+
function filterArr(root, operation) {
986
+
const operationKeys = Object.keys(operation);
987
+
if (operationKeys.length !== 1) {
988
+
throw new Error("Invalid operation");
989
+
}
990
+
const operationType = operationKeys[0];
991
+
switch (operationType) {
992
+
case "containsAll": {
993
+
const values = operation[operationType];
994
+
const ids = values.map((value) => root.numberToDocumentId.get(value) ?? []);
995
+
return intersect(ids);
996
+
}
997
+
}
998
+
throw new Error("Invalid operation");
999
+
}
1000
+
__name(filterArr, "filterArr");
1001
+
1002
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/levenshtein.ts
1003
+
function _boundedLevenshtein(a, b, tolerance) {
1004
+
if (a === b) {
1005
+
return 0;
1006
+
}
1007
+
const swap = a;
1008
+
if (a.length > b.length) {
1009
+
a = b;
1010
+
b = swap;
1011
+
}
1012
+
let lenA = a.length;
1013
+
let lenB = b.length;
1014
+
let startIdx = 0;
1015
+
while (startIdx < lenA && a.charCodeAt(startIdx) === b.charCodeAt(startIdx)) {
1016
+
startIdx++;
1017
+
}
1018
+
if (startIdx === lenA) {
1019
+
return 0;
1020
+
}
1021
+
while (lenA > 0 && a.charCodeAt(~-lenA) === b.charCodeAt(~-lenB)) {
1022
+
lenA--;
1023
+
lenB--;
1024
+
}
1025
+
if (!lenA) {
1026
+
return lenB > tolerance ? -1 : lenB;
1027
+
}
1028
+
lenA -= startIdx;
1029
+
lenB -= startIdx;
1030
+
if (lenA <= tolerance && lenB <= tolerance) {
1031
+
return lenA > lenB ? lenA : lenB;
1032
+
}
1033
+
const delta = lenB - lenA;
1034
+
if (tolerance > lenB) {
1035
+
tolerance = lenB;
1036
+
} else if (delta > tolerance) {
1037
+
return -1;
1038
+
}
1039
+
let i = 0;
1040
+
const row = [];
1041
+
const characterCodeCache = [];
1042
+
while (i < tolerance) {
1043
+
characterCodeCache[i] = b.charCodeAt(startIdx + i);
1044
+
row[i] = ++i;
1045
+
}
1046
+
while (i < lenB) {
1047
+
characterCodeCache[i] = b.charCodeAt(startIdx + i);
1048
+
row[i++] = tolerance + 1;
1049
+
}
1050
+
const offset = tolerance - delta;
1051
+
const haveMax = tolerance < lenB;
1052
+
let jStart = 0;
1053
+
let jEnd = tolerance;
1054
+
let current = 0;
1055
+
let left = 0;
1056
+
let above = 0;
1057
+
let charA = 0;
1058
+
let j = 0;
1059
+
for (i = 0; i < lenA; i++) {
1060
+
left = i;
1061
+
current = i + 1;
1062
+
charA = a.charCodeAt(startIdx + i);
1063
+
jStart += i > offset ? 1 : 0;
1064
+
jEnd += jEnd < lenB ? 1 : 0;
1065
+
for (j = jStart; j < jEnd; j++) {
1066
+
above = current;
1067
+
current = left;
1068
+
left = row[j];
1069
+
if (charA !== characterCodeCache[j]) {
1070
+
if (left < current) {
1071
+
current = left;
1072
+
}
1073
+
if (above < current) {
1074
+
current = above;
1075
+
}
1076
+
current++;
1077
+
}
1078
+
row[j] = current;
1079
+
}
1080
+
if (haveMax && row[i + delta] > tolerance) {
1081
+
return -1;
1082
+
}
1083
+
}
1084
+
return current <= tolerance ? current : -1;
1085
+
}
1086
+
__name(_boundedLevenshtein, "_boundedLevenshtein");
1087
+
function syncBoundedLevenshtein(a, b, tolerance) {
1088
+
const distance = _boundedLevenshtein(a, b, tolerance);
1089
+
return {
1090
+
distance,
1091
+
isBounded: distance >= 0
1092
+
};
1093
+
}
1094
+
__name(syncBoundedLevenshtein, "syncBoundedLevenshtein");
1095
+
1096
+
// https:https://jsr.io/@orama/orama/2.0.6/src/trees/radix.ts
1097
+
var _Node = class _Node {
1098
+
constructor(key, subWord, end) {
1099
+
this.k = key;
1100
+
this.s = subWord;
1101
+
this.e = end;
1102
+
}
1103
+
// Node key
1104
+
k;
1105
+
// Node subword
1106
+
s;
1107
+
// Node children
1108
+
c = {};
1109
+
// Node documents
1110
+
d = [];
1111
+
// Node end
1112
+
e;
1113
+
// Node word
1114
+
w = "";
1115
+
toJSON() {
1116
+
return {
1117
+
w: this.w,
1118
+
s: this.s,
1119
+
c: this.c,
1120
+
d: this.d,
1121
+
e: this.e
1122
+
};
1123
+
}
1124
+
};
1125
+
__name(_Node, "Node");
1126
+
var Node = _Node;
1127
+
function updateParent(node, parent) {
1128
+
node.w = parent.w + node.s;
1129
+
}
1130
+
__name(updateParent, "updateParent");
1131
+
function addDocument(node, docID) {
1132
+
node.d.push(docID);
1133
+
}
1134
+
__name(addDocument, "addDocument");
1135
+
function removeDocument3(node, docID) {
1136
+
const index = node.d.indexOf(docID);
1137
+
if (index === -1) {
1138
+
return false;
1139
+
}
1140
+
node.d.splice(index, 1);
1141
+
return true;
1142
+
}
1143
+
__name(removeDocument3, "removeDocument");
1144
+
function findAllWords(node, output, term, exact, tolerance) {
1145
+
if (node.e) {
1146
+
const { w, d: docIDs } = node;
1147
+
if (exact && w !== term) {
1148
+
return {};
1149
+
}
1150
+
if (getOwnProperty(output, w) == null) {
1151
+
if (tolerance) {
1152
+
const difference = Math.abs(term.length - w.length);
1153
+
if (difference <= tolerance && syncBoundedLevenshtein(term, w, tolerance).isBounded) {
1154
+
output[w] = [];
1155
+
}
1156
+
} else {
1157
+
output[w] = [];
1158
+
}
1159
+
}
1160
+
if (getOwnProperty(output, w) != null && docIDs.length > 0) {
1161
+
const docs = new Set(output[w]);
1162
+
const docIDsLength = docIDs.length;
1163
+
for (let i = 0; i < docIDsLength; i++) {
1164
+
docs.add(docIDs[i]);
1165
+
}
1166
+
output[w] = Array.from(docs);
1167
+
}
1168
+
}
1169
+
for (const character of Object.keys(node.c)) {
1170
+
findAllWords(node.c[character], output, term, exact, tolerance);
1171
+
}
1172
+
return output;
1173
+
}
1174
+
__name(findAllWords, "findAllWords");
1175
+
function getCommonPrefix(a, b) {
1176
+
let commonPrefix = "";
1177
+
const len = Math.min(a.length, b.length);
1178
+
for (let i = 0; i < len; i++) {
1179
+
if (a[i] !== b[i]) {
1180
+
return commonPrefix;
1181
+
}
1182
+
commonPrefix += a[i];
1183
+
}
1184
+
return commonPrefix;
1185
+
}
1186
+
__name(getCommonPrefix, "getCommonPrefix");
1187
+
function create4(end = false, subWord = "", key = "") {
1188
+
return new Node(key, subWord, end);
1189
+
}
1190
+
__name(create4, "create");
1191
+
function insert3(root, word, docId) {
1192
+
const wordLength = word.length;
1193
+
for (let i = 0; i < wordLength; i++) {
1194
+
const currentCharacter = word[i];
1195
+
const wordAtIndex = word.substring(i);
1196
+
const rootChildCurrentChar = root.c[currentCharacter];
1197
+
if (rootChildCurrentChar) {
1198
+
const edgeLabel = rootChildCurrentChar.s;
1199
+
const edgeLabelLength = edgeLabel.length;
1200
+
const commonPrefix = getCommonPrefix(edgeLabel, wordAtIndex);
1201
+
const commonPrefixLength = commonPrefix.length;
1202
+
if (edgeLabel === wordAtIndex) {
1203
+
addDocument(rootChildCurrentChar, docId);
1204
+
rootChildCurrentChar.e = true;
1205
+
return;
1206
+
}
1207
+
const edgeLabelAtCommonPrefix = edgeLabel[commonPrefixLength];
1208
+
if (commonPrefixLength < edgeLabelLength && commonPrefixLength === wordAtIndex.length) {
1209
+
const newNode = create4(true, wordAtIndex, currentCharacter);
1210
+
newNode.c[edgeLabelAtCommonPrefix] = rootChildCurrentChar;
1211
+
const newNodeChild = newNode.c[edgeLabelAtCommonPrefix];
1212
+
newNodeChild.s = edgeLabel.substring(commonPrefixLength);
1213
+
newNodeChild.k = edgeLabelAtCommonPrefix;
1214
+
root.c[currentCharacter] = newNode;
1215
+
updateParent(newNode, root);
1216
+
updateParent(newNodeChild, newNode);
1217
+
addDocument(newNode, docId);
1218
+
return;
1219
+
}
1220
+
if (commonPrefixLength < edgeLabelLength && commonPrefixLength < wordAtIndex.length) {
1221
+
const inbetweenNode = create4(false, commonPrefix, currentCharacter);
1222
+
inbetweenNode.c[edgeLabelAtCommonPrefix] = rootChildCurrentChar;
1223
+
root.c[currentCharacter] = inbetweenNode;
1224
+
const inbetweenNodeChild = inbetweenNode.c[edgeLabelAtCommonPrefix];
1225
+
inbetweenNodeChild.s = edgeLabel.substring(commonPrefixLength);
1226
+
inbetweenNodeChild.k = edgeLabelAtCommonPrefix;
1227
+
const wordAtCommonPrefix = wordAtIndex[commonPrefixLength];
1228
+
const newNode = create4(true, word.substring(i + commonPrefixLength), wordAtCommonPrefix);
1229
+
addDocument(newNode, docId);
1230
+
inbetweenNode.c[wordAtCommonPrefix] = newNode;
1231
+
updateParent(inbetweenNode, root);
1232
+
updateParent(newNode, inbetweenNode);
1233
+
updateParent(inbetweenNodeChild, inbetweenNode);
1234
+
return;
1235
+
}
1236
+
i += edgeLabelLength - 1;
1237
+
root = rootChildCurrentChar;
1238
+
} else {
1239
+
const newNode = create4(true, wordAtIndex, currentCharacter);
1240
+
addDocument(newNode, docId);
1241
+
root.c[currentCharacter] = newNode;
1242
+
updateParent(newNode, root);
1243
+
return;
1244
+
}
1245
+
}
1246
+
}
1247
+
__name(insert3, "insert");
1248
+
function _findLevenshtein(node, term, index, tolerance, originalTolerance, output) {
1249
+
if (tolerance < 0) {
1250
+
return;
1251
+
}
1252
+
if (node.w.startsWith(term)) {
1253
+
findAllWords(node, output, term, false, 0);
1254
+
return;
1255
+
}
1256
+
if (node.e) {
1257
+
const { w, d: docIDs } = node;
1258
+
if (w) {
1259
+
if (syncBoundedLevenshtein(term, w, originalTolerance).isBounded) {
1260
+
output[w] = [];
1261
+
}
1262
+
if (getOwnProperty(output, w) != null && docIDs.length > 0) {
1263
+
const docs = new Set(output[w]);
1264
+
const docIDsLength = docIDs.length;
1265
+
for (let i = 0; i < docIDsLength; i++) {
1266
+
docs.add(docIDs[i]);
1267
+
}
1268
+
output[w] = Array.from(docs);
1269
+
}
1270
+
}
1271
+
}
1272
+
if (index >= term.length) {
1273
+
return;
1274
+
}
1275
+
if (term[index] in node.c) {
1276
+
_findLevenshtein(node.c[term[index]], term, index + 1, tolerance, originalTolerance, output);
1277
+
}
1278
+
_findLevenshtein(node, term, index + 1, tolerance - 1, originalTolerance, output);
1279
+
for (const character in node.c) {
1280
+
_findLevenshtein(node.c[character], term, index, tolerance - 1, originalTolerance, output);
1281
+
}
1282
+
for (const character in node.c) {
1283
+
if (character !== term[index]) {
1284
+
_findLevenshtein(node.c[character], term, index + 1, tolerance - 1, originalTolerance, output);
1285
+
}
1286
+
}
1287
+
}
1288
+
__name(_findLevenshtein, "_findLevenshtein");
1289
+
function find2(root, { term, exact, tolerance }) {
1290
+
if (tolerance && !exact) {
1291
+
const output = {};
1292
+
tolerance = tolerance || 0;
1293
+
_findLevenshtein(root, term, 0, tolerance || 0, tolerance, output);
1294
+
return output;
1295
+
} else {
1296
+
const termLength = term.length;
1297
+
for (let i = 0; i < termLength; i++) {
1298
+
const character = term[i];
1299
+
if (character in root.c) {
1300
+
const rootChildCurrentChar = root.c[character];
1301
+
const edgeLabel = rootChildCurrentChar.s;
1302
+
const termSubstring = term.substring(i);
1303
+
const commonPrefix = getCommonPrefix(edgeLabel, termSubstring);
1304
+
const commonPrefixLength = commonPrefix.length;
1305
+
if (commonPrefixLength !== edgeLabel.length && commonPrefixLength !== termSubstring.length) {
1306
+
if (tolerance) break;
1307
+
return {};
1308
+
}
1309
+
i += rootChildCurrentChar.s.length - 1;
1310
+
root = rootChildCurrentChar;
1311
+
} else {
1312
+
return {};
1313
+
}
1314
+
}
1315
+
const output = {};
1316
+
findAllWords(root, output, term, exact, tolerance);
1317
+
return output;
1318
+
}
1319
+
}
1320
+
__name(find2, "find");
1321
+
function removeDocumentByWord(root, term, docID, exact = true) {
1322
+
if (!term) {
1323
+
return true;
1324
+
}
1325
+
const termLength = term.length;
1326
+
for (let i = 0; i < termLength; i++) {
1327
+
const character = term[i];
1328
+
if (character in root.c) {
1329
+
const rootChildCurrentChar = root.c[character];
1330
+
i += rootChildCurrentChar.s.length - 1;
1331
+
root = rootChildCurrentChar;
1332
+
if (exact && root.w !== term) {
1333
+
} else {
1334
+
removeDocument3(root, docID);
1335
+
}
1336
+
} else {
1337
+
return false;
1338
+
}
1339
+
}
1340
+
return true;
1341
+
}
1342
+
__name(removeDocumentByWord, "removeDocumentByWord");
1343
+
1344
+
// https:https://jsr.io/@orama/orama/2.0.6/src/trees/bkd.ts
1345
+
var K = 2;
1346
+
var EARTH_RADIUS = 6371e3;
1347
+
function create5() {
1348
+
return {
1349
+
root: null
1350
+
};
1351
+
}
1352
+
__name(create5, "create");
1353
+
function insert4(tree, point, docIDs) {
1354
+
const newNode = {
1355
+
point,
1356
+
docIDs
1357
+
};
1358
+
if (tree.root == null) {
1359
+
tree.root = newNode;
1360
+
return;
1361
+
}
1362
+
let node = tree.root;
1363
+
let depth = 0;
1364
+
while (node !== null) {
1365
+
if (node.point.lon === point.lon && node.point.lat === point.lat) {
1366
+
const newDocIDs = node.docIDs ?? [];
1367
+
node.docIDs = Array.from(/* @__PURE__ */ new Set([
1368
+
...newDocIDs,
1369
+
...docIDs || []
1370
+
]));
1371
+
return;
1372
+
}
1373
+
const axis = depth % K;
1374
+
if (axis === 0) {
1375
+
if (point.lon < node.point.lon) {
1376
+
if (node.left == null) {
1377
+
node.left = newNode;
1378
+
return;
1379
+
}
1380
+
node = node.left;
1381
+
} else {
1382
+
if (node.right == null) {
1383
+
node.right = newNode;
1384
+
return;
1385
+
}
1386
+
node = node.right;
1387
+
}
1388
+
} else {
1389
+
if (point.lat < node.point.lat) {
1390
+
if (node.left == null) {
1391
+
node.left = newNode;
1392
+
return;
1393
+
}
1394
+
node = node.left;
1395
+
} else {
1396
+
if (node.right == null) {
1397
+
node.right = newNode;
1398
+
return;
1399
+
}
1400
+
node = node.right;
1401
+
}
1402
+
}
1403
+
depth++;
1404
+
}
1405
+
}
1406
+
__name(insert4, "insert");
1407
+
function removeDocByID(tree, point, docID) {
1408
+
let node = tree.root;
1409
+
let depth = 0;
1410
+
let parentNode = null;
1411
+
let direction = null;
1412
+
while (node !== null) {
1413
+
if (node?.point.lon === point.lon && node.point.lat === point.lat) {
1414
+
const index = node.docIDs?.indexOf(docID);
1415
+
if (index !== void 0 && index > -1) {
1416
+
node.docIDs?.splice(index, 1);
1417
+
if (node.docIDs == null || node.docIDs.length === 0) {
1418
+
if (parentNode != null) {
1419
+
if (direction === "left") {
1420
+
parentNode.left = node.left !== null ? node.left : node.right;
1421
+
} else if (direction === "right") {
1422
+
parentNode.right = node.right !== null ? node.right : node.left;
1423
+
}
1424
+
} else {
1425
+
tree.root = node.left !== null ? node.left : node.right;
1426
+
}
1427
+
}
1428
+
return;
1429
+
}
1430
+
}
1431
+
const axis = depth % K;
1432
+
parentNode = node;
1433
+
if (axis === 0) {
1434
+
if (point.lon < node.point.lon) {
1435
+
node = node?.left;
1436
+
direction = "left";
1437
+
} else {
1438
+
node = node?.right;
1439
+
direction = "right";
1440
+
}
1441
+
} else {
1442
+
if (point.lat < node.point.lat) {
1443
+
node = node?.left;
1444
+
direction = "left";
1445
+
} else {
1446
+
node = node?.right;
1447
+
direction = "right";
1448
+
}
1449
+
}
1450
+
depth++;
1451
+
}
1452
+
}
1453
+
__name(removeDocByID, "removeDocByID");
1454
+
function searchByRadius(node, center, radius, inclusive = true, sort = "asc", highPrecision = false) {
1455
+
const distanceFn = highPrecision ? vincentyDistance : haversineDistance;
1456
+
const stack = [
1457
+
{
1458
+
node,
1459
+
depth: 0
1460
+
}
1461
+
];
1462
+
const result = [];
1463
+
while (stack.length > 0) {
1464
+
const { node: node2, depth } = stack.pop();
1465
+
if (node2 === null) continue;
1466
+
const dist = distanceFn(center, node2.point);
1467
+
if (inclusive ? dist <= radius : dist > radius) {
1468
+
result.push({
1469
+
point: node2.point,
1470
+
docIDs: node2.docIDs ?? []
1471
+
});
1472
+
}
1473
+
if (node2.left != null) {
1474
+
stack.push({
1475
+
node: node2.left,
1476
+
depth: depth + 1
1477
+
});
1478
+
}
1479
+
if (node2.right != null) {
1480
+
stack.push({
1481
+
node: node2.right,
1482
+
depth: depth + 1
1483
+
});
1484
+
}
1485
+
}
1486
+
if (sort) {
1487
+
result.sort((a, b) => {
1488
+
const distA = distanceFn(center, a.point);
1489
+
const distB = distanceFn(center, b.point);
1490
+
return sort.toLowerCase() === "asc" ? distA - distB : distB - distA;
1491
+
});
1492
+
}
1493
+
return result;
1494
+
}
1495
+
__name(searchByRadius, "searchByRadius");
1496
+
function searchByPolygon(root, polygon, inclusive = true, sort = null, highPrecision = false) {
1497
+
const stack = [
1498
+
{
1499
+
node: root,
1500
+
depth: 0
1501
+
}
1502
+
];
1503
+
const result = [];
1504
+
while (stack.length > 0) {
1505
+
const task = stack.pop();
1506
+
if (task == null || task.node == null) continue;
1507
+
const { node, depth } = task;
1508
+
const nextDepth = depth + 1;
1509
+
if (node.left != null) {
1510
+
stack.push({
1511
+
node: node.left,
1512
+
depth: nextDepth
1513
+
});
1514
+
}
1515
+
if (node.right != null) {
1516
+
stack.push({
1517
+
node: node.right,
1518
+
depth: nextDepth
1519
+
});
1520
+
}
1521
+
const isInsidePolygon = isPointInPolygon(polygon, node.point);
1522
+
if (isInsidePolygon && inclusive) {
1523
+
result.push({
1524
+
point: node.point,
1525
+
docIDs: node.docIDs ?? []
1526
+
});
1527
+
} else if (!isInsidePolygon && !inclusive) {
1528
+
result.push({
1529
+
point: node.point,
1530
+
docIDs: node.docIDs ?? []
1531
+
});
1532
+
}
1533
+
}
1534
+
const centroid = calculatePolygonCentroid(polygon);
1535
+
if (sort) {
1536
+
const sortFn = highPrecision ? vincentyDistance : haversineDistance;
1537
+
result.sort((a, b) => {
1538
+
const distA = sortFn(centroid, a.point);
1539
+
const distB = sortFn(centroid, b.point);
1540
+
return sort.toLowerCase() === "asc" ? distA - distB : distB - distA;
1541
+
});
1542
+
}
1543
+
return result;
1544
+
}
1545
+
__name(searchByPolygon, "searchByPolygon");
1546
+
function calculatePolygonCentroid(polygon) {
1547
+
let totalArea = 0;
1548
+
let centroidX = 0;
1549
+
let centroidY = 0;
1550
+
const polygonLength = polygon.length;
1551
+
for (let i = 0, j = polygonLength - 1; i < polygonLength; j = i++) {
1552
+
const xi = polygon[i].lon;
1553
+
const yi = polygon[i].lat;
1554
+
const xj = polygon[j].lon;
1555
+
const yj = polygon[j].lat;
1556
+
const areaSegment = xi * yj - xj * yi;
1557
+
totalArea += areaSegment;
1558
+
centroidX += (xi + xj) * areaSegment;
1559
+
centroidY += (yi + yj) * areaSegment;
1560
+
}
1561
+
totalArea /= 2;
1562
+
const centroidCoordinate = 6 * totalArea;
1563
+
centroidX /= centroidCoordinate;
1564
+
centroidY /= centroidCoordinate;
1565
+
return {
1566
+
lon: centroidX,
1567
+
lat: centroidY
1568
+
};
1569
+
}
1570
+
__name(calculatePolygonCentroid, "calculatePolygonCentroid");
1571
+
function isPointInPolygon(polygon, point) {
1572
+
let isInside = false;
1573
+
const x = point.lon;
1574
+
const y = point.lat;
1575
+
const polygonLength = polygon.length;
1576
+
for (let i = 0, j = polygonLength - 1; i < polygonLength; j = i++) {
1577
+
const xi = polygon[i].lon;
1578
+
const yi = polygon[i].lat;
1579
+
const xj = polygon[j].lon;
1580
+
const yj = polygon[j].lat;
1581
+
const intersect2 = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
1582
+
if (intersect2) isInside = !isInside;
1583
+
}
1584
+
return isInside;
1585
+
}
1586
+
__name(isPointInPolygon, "isPointInPolygon");
1587
+
function haversineDistance(coord1, coord2) {
1588
+
const P = Math.PI / 180;
1589
+
const lat1 = coord1.lat * P;
1590
+
const lat2 = coord2.lat * P;
1591
+
const deltaLat = (coord2.lat - coord1.lat) * P;
1592
+
const deltaLon = (coord2.lon - coord1.lon) * P;
1593
+
const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);
1594
+
const c2 = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
1595
+
return EARTH_RADIUS * c2;
1596
+
}
1597
+
__name(haversineDistance, "haversineDistance");
1598
+
function vincentyDistance(coord1, coord2) {
1599
+
const a = 6378137;
1600
+
const f = 1 / 298.257223563;
1601
+
const b = (1 - f) * a;
1602
+
const P = Math.PI / 180;
1603
+
const lat1 = coord1.lat * P;
1604
+
const lat2 = coord2.lat * P;
1605
+
const deltaLon = (coord2.lon - coord1.lon) * P;
1606
+
const U1 = Math.atan((1 - f) * Math.tan(lat1));
1607
+
const U2 = Math.atan((1 - f) * Math.tan(lat2));
1608
+
const sinU1 = Math.sin(U1);
1609
+
const cosU1 = Math.cos(U1);
1610
+
const sinU2 = Math.sin(U2);
1611
+
const cosU2 = Math.cos(U2);
1612
+
let lambda = deltaLon;
1613
+
let prevLambda;
1614
+
let iterationLimit = 1e3;
1615
+
let sinAlpha;
1616
+
let cos2Alpha;
1617
+
let sinSigma;
1618
+
let cosSigma;
1619
+
let sigma;
1620
+
do {
1621
+
const sinLambda = Math.sin(lambda);
1622
+
const cosLambda = Math.cos(lambda);
1623
+
sinSigma = Math.sqrt(cosU2 * sinLambda * (cosU2 * sinLambda) + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda));
1624
+
cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
1625
+
sigma = Math.atan2(sinSigma, cosSigma);
1626
+
sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
1627
+
cos2Alpha = 1 - sinAlpha * sinAlpha;
1628
+
const cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cos2Alpha;
1629
+
const C2 = f / 16 * cos2Alpha * (4 + f * (4 - 3 * cos2Alpha));
1630
+
prevLambda = lambda;
1631
+
lambda = deltaLon + (1 - C2) * f * sinAlpha * (sigma + C2 * sinSigma * (cos2SigmaM + C2 * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
1632
+
} while (Math.abs(lambda - prevLambda) > 1e-12 && --iterationLimit > 0);
1633
+
const u2 = cos2Alpha * (a * a - b * b) / (b * b);
1634
+
const A = 1 + u2 / 16384 * (4096 + u2 * (-768 + u2 * (320 - 175 * u2)));
1635
+
const B = u2 / 1024 * (256 + u2 * (-128 + u2 * (74 - 47 * u2)));
1636
+
const deltaSigma = B * sinSigma * (cosSigma - 2 * sinU1 * sinU2 / cos2Alpha + B / 4 * (cosSigma * (-1 + 2 * sinSigma * sinSigma) - B / 6 * sigma * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * sigma * sigma)));
1637
+
const s = b * A * (sigma - deltaSigma);
1638
+
return s;
1639
+
}
1640
+
__name(vincentyDistance, "vincentyDistance");
1641
+
1642
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/algorithms.ts
1643
+
function prioritizeTokenScores(arrays, boost, threshold = 1, keywordsCount) {
1644
+
if (boost === 0) {
1645
+
throw createError("INVALID_BOOST_VALUE");
1646
+
}
1647
+
const tokenScoresMap = /* @__PURE__ */ new Map();
1648
+
const tokenKeywordsCountMap = /* @__PURE__ */ new Map();
1649
+
const mapsLength = arrays.length;
1650
+
for (let i = 0; i < mapsLength; i++) {
1651
+
const arr = arrays[i];
1652
+
const entriesLength = arr.length;
1653
+
for (let j = 0; j < entriesLength; j++) {
1654
+
const [token, score] = arr[j];
1655
+
const boostScore = score * boost;
1656
+
const oldScore = tokenScoresMap.get(token);
1657
+
if (oldScore !== void 0) {
1658
+
tokenScoresMap.set(token, oldScore * 1.5 + boostScore);
1659
+
tokenKeywordsCountMap.set(token, tokenKeywordsCountMap.get(token) + 1);
1660
+
} else {
1661
+
tokenScoresMap.set(token, boostScore);
1662
+
tokenKeywordsCountMap.set(token, 1);
1663
+
}
1664
+
}
1665
+
}
1666
+
const tokenScores = [];
1667
+
for (const tokenScoreEntry of tokenScoresMap.entries()) {
1668
+
tokenScores.push(tokenScoreEntry);
1669
+
}
1670
+
const results = tokenScores.sort((a, b) => b[1] - a[1]);
1671
+
if (threshold === 1) {
1672
+
return results;
1673
+
}
1674
+
const allResults = results.length;
1675
+
const tokenKeywordsCount = [];
1676
+
for (const tokenKeywordsCountEntry of tokenKeywordsCountMap.entries()) {
1677
+
tokenKeywordsCount.push(tokenKeywordsCountEntry);
1678
+
}
1679
+
const keywordsPerToken = tokenKeywordsCount.sort((a, b) => b[1] - a[1]);
1680
+
let lastTokenWithAllKeywords = void 0;
1681
+
for (let i = 0; i < allResults; i++) {
1682
+
if (keywordsPerToken[i][1] === keywordsCount) {
1683
+
lastTokenWithAllKeywords = i;
1684
+
} else {
1685
+
break;
1686
+
}
1687
+
}
1688
+
if (typeof lastTokenWithAllKeywords === "undefined") {
1689
+
if (threshold === 0) {
1690
+
return [];
1691
+
}
1692
+
lastTokenWithAllKeywords = 0;
1693
+
}
1694
+
if (threshold === 0) {
1695
+
return results.slice(0, lastTokenWithAllKeywords + 1);
1696
+
}
1697
+
const thresholdLength = lastTokenWithAllKeywords + Math.ceil(threshold * 100 * (results.length - lastTokenWithAllKeywords) / 100);
1698
+
return results.slice(0, results.length + thresholdLength);
1699
+
}
1700
+
__name(prioritizeTokenScores, "prioritizeTokenScores");
1701
+
function BM25(tf, matchingCount, docsCount, fieldLength, averageFieldLength, BM25Params) {
1702
+
const { k, b, d } = BM25Params;
1703
+
const idf = Math.log(1 + (docsCount - matchingCount + 0.5) / (matchingCount + 0.5));
1704
+
return idf * (d + tf * (k + 1)) / (tf + k * (1 - b + b * fieldLength / averageFieldLength));
1705
+
}
1706
+
__name(BM25, "BM25");
1707
+
1708
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/cosine-similarity.ts
1709
+
function getMagnitude(vector, vectorLength) {
1710
+
let magnitude = 0;
1711
+
for (let i = 0; i < vectorLength; i++) {
1712
+
magnitude += vector[i] * vector[i];
1713
+
}
1714
+
return Math.sqrt(magnitude);
1715
+
}
1716
+
__name(getMagnitude, "getMagnitude");
1717
+
function findSimilarVectors(targetVector, vectors, length, threshold = 0.8) {
1718
+
const targetMagnitude = getMagnitude(targetVector, length);
1719
+
const similarVectors = [];
1720
+
for (const [vectorId, [magnitude, vector]] of Object.entries(vectors)) {
1721
+
let dotProduct = 0;
1722
+
for (let i = 0; i < length; i++) {
1723
+
dotProduct += targetVector[i] * vector[i];
1724
+
}
1725
+
const similarity = dotProduct / (targetMagnitude * magnitude);
1726
+
if (similarity >= threshold) {
1727
+
similarVectors.push([
1728
+
vectorId,
1729
+
similarity
1730
+
]);
1731
+
}
1732
+
}
1733
+
return similarVectors.sort((a, b) => b[1] - a[1]);
1734
+
}
1735
+
__name(findSimilarVectors, "findSimilarVectors");
1736
+
1737
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/index.ts
1738
+
async function insertDocumentScoreParameters(index, prop, id, tokens, docsCount) {
1739
+
const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);
1740
+
index.avgFieldLength[prop] = ((index.avgFieldLength[prop] ?? 0) * (docsCount - 1) + tokens.length) / docsCount;
1741
+
index.fieldLengths[prop][internalId] = tokens.length;
1742
+
index.frequencies[prop][internalId] = {};
1743
+
}
1744
+
__name(insertDocumentScoreParameters, "insertDocumentScoreParameters");
1745
+
async function insertTokenScoreParameters(index, prop, id, tokens, token) {
1746
+
let tokenFrequency = 0;
1747
+
for (const t of tokens) {
1748
+
if (t === token) {
1749
+
tokenFrequency++;
1750
+
}
1751
+
}
1752
+
const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);
1753
+
const tf = tokenFrequency / tokens.length;
1754
+
index.frequencies[prop][internalId][token] = tf;
1755
+
if (!(token in index.tokenOccurrences[prop])) {
1756
+
index.tokenOccurrences[prop][token] = 0;
1757
+
}
1758
+
index.tokenOccurrences[prop][token] = (index.tokenOccurrences[prop][token] ?? 0) + 1;
1759
+
}
1760
+
__name(insertTokenScoreParameters, "insertTokenScoreParameters");
1761
+
async function removeDocumentScoreParameters(index, prop, id, docsCount) {
1762
+
const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);
1763
+
index.avgFieldLength[prop] = (index.avgFieldLength[prop] * docsCount - index.fieldLengths[prop][internalId]) / (docsCount - 1);
1764
+
index.fieldLengths[prop][internalId] = void 0;
1765
+
index.frequencies[prop][internalId] = void 0;
1766
+
}
1767
+
__name(removeDocumentScoreParameters, "removeDocumentScoreParameters");
1768
+
async function removeTokenScoreParameters(index, prop, token) {
1769
+
index.tokenOccurrences[prop][token]--;
1770
+
}
1771
+
__name(removeTokenScoreParameters, "removeTokenScoreParameters");
1772
+
async function calculateResultScores(context, index, prop, term, ids) {
1773
+
const documentIDs = Array.from(ids);
1774
+
const avgFieldLength = index.avgFieldLength[prop];
1775
+
const fieldLengths = index.fieldLengths[prop];
1776
+
const oramaOccurrences = index.tokenOccurrences[prop];
1777
+
const oramaFrequencies = index.frequencies[prop];
1778
+
const termOccurrences = typeof oramaOccurrences[term] === "number" ? oramaOccurrences[term] ?? 0 : 0;
1779
+
const scoreList = [];
1780
+
const documentIDsLength = documentIDs.length;
1781
+
for (let k = 0; k < documentIDsLength; k++) {
1782
+
const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, documentIDs[k]);
1783
+
const tf = oramaFrequencies?.[internalId]?.[term] ?? 0;
1784
+
const bm25 = BM25(tf, termOccurrences, context.docsCount, fieldLengths[internalId], avgFieldLength, context.params.relevance);
1785
+
scoreList.push([
1786
+
internalId,
1787
+
bm25
1788
+
]);
1789
+
}
1790
+
return scoreList;
1791
+
}
1792
+
__name(calculateResultScores, "calculateResultScores");
1793
+
async function create6(orama, sharedInternalDocumentStore, schema, index, prefix = "") {
1794
+
if (!index) {
1795
+
index = {
1796
+
sharedInternalDocumentStore,
1797
+
indexes: {},
1798
+
vectorIndexes: {},
1799
+
searchableProperties: [],
1800
+
searchablePropertiesWithTypes: {},
1801
+
frequencies: {},
1802
+
tokenOccurrences: {},
1803
+
avgFieldLength: {},
1804
+
fieldLengths: {}
1805
+
};
1806
+
}
1807
+
for (const [prop, type] of Object.entries(schema)) {
1808
+
const path = `${prefix}${prefix ? "." : ""}${prop}`;
1809
+
if (typeof type === "object" && !Array.isArray(type)) {
1810
+
create6(orama, sharedInternalDocumentStore, type, index, path);
1811
+
continue;
1812
+
}
1813
+
if (isVectorType(type)) {
1814
+
index.searchableProperties.push(path);
1815
+
index.searchablePropertiesWithTypes[path] = type;
1816
+
index.vectorIndexes[path] = {
1817
+
size: getVectorSize(type),
1818
+
vectors: {}
1819
+
};
1820
+
} else {
1821
+
const isArray = /\[/.test(type);
1822
+
switch (type) {
1823
+
case "boolean":
1824
+
case "boolean[]":
1825
+
index.indexes[path] = {
1826
+
type: "Bool",
1827
+
node: {
1828
+
true: [],
1829
+
false: []
1830
+
},
1831
+
isArray
1832
+
};
1833
+
break;
1834
+
case "number":
1835
+
case "number[]":
1836
+
index.indexes[path] = {
1837
+
type: "AVL",
1838
+
node: create2(0, []),
1839
+
isArray
1840
+
};
1841
+
break;
1842
+
case "string":
1843
+
case "string[]":
1844
+
index.indexes[path] = {
1845
+
type: "Radix",
1846
+
node: create4(),
1847
+
isArray
1848
+
};
1849
+
index.avgFieldLength[path] = 0;
1850
+
index.frequencies[path] = {};
1851
+
index.tokenOccurrences[path] = {};
1852
+
index.fieldLengths[path] = {};
1853
+
break;
1854
+
case "enum":
1855
+
case "enum[]":
1856
+
index.indexes[path] = {
1857
+
type: "Flat",
1858
+
node: create3(),
1859
+
isArray
1860
+
};
1861
+
break;
1862
+
case "geopoint":
1863
+
index.indexes[path] = {
1864
+
type: "BKD",
1865
+
node: create5(),
1866
+
isArray
1867
+
};
1868
+
break;
1869
+
default:
1870
+
throw createError("INVALID_SCHEMA_TYPE", Array.isArray(type) ? "array" : type, path);
1871
+
}
1872
+
index.searchableProperties.push(path);
1873
+
index.searchablePropertiesWithTypes[path] = type;
1874
+
}
1875
+
}
1876
+
return index;
1877
+
}
1878
+
__name(create6, "create");
1879
+
async function insertScalar(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount) {
1880
+
const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);
1881
+
const { type, node } = index.indexes[prop];
1882
+
switch (type) {
1883
+
case "Bool": {
1884
+
node[value ? "true" : "false"].push(internalId);
1885
+
break;
1886
+
}
1887
+
case "AVL": {
1888
+
insert(node, value, [
1889
+
internalId
1890
+
]);
1891
+
break;
1892
+
}
1893
+
case "Radix": {
1894
+
const tokens = await tokenizer.tokenize(value, language, prop);
1895
+
await implementation.insertDocumentScoreParameters(index, prop, internalId, tokens, docsCount);
1896
+
for (const token of tokens) {
1897
+
await implementation.insertTokenScoreParameters(index, prop, internalId, tokens, token);
1898
+
insert3(node, token, internalId);
1899
+
}
1900
+
break;
1901
+
}
1902
+
case "Flat": {
1903
+
insert2(node, value, internalId);
1904
+
break;
1905
+
}
1906
+
case "BKD": {
1907
+
insert4(node, value, [
1908
+
internalId
1909
+
]);
1910
+
break;
1911
+
}
1912
+
}
1913
+
}
1914
+
__name(insertScalar, "insertScalar");
1915
+
async function insert5(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount) {
1916
+
if (isVectorType(schemaType)) {
1917
+
return insertVector(index, prop, value, id);
1918
+
}
1919
+
if (!isArrayType(schemaType)) {
1920
+
return insertScalar(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount);
1921
+
}
1922
+
const innerSchemaType = getInnerType(schemaType);
1923
+
const elements = value;
1924
+
const elementsLength = elements.length;
1925
+
for (let i = 0; i < elementsLength; i++) {
1926
+
await insertScalar(implementation, index, prop, id, elements[i], innerSchemaType, language, tokenizer, docsCount);
1927
+
}
1928
+
}
1929
+
__name(insert5, "insert");
1930
+
function insertVector(index, prop, value, id) {
1931
+
if (!(value instanceof Float32Array)) {
1932
+
value = new Float32Array(value);
1933
+
}
1934
+
const size = index.vectorIndexes[prop].size;
1935
+
const magnitude = getMagnitude(value, size);
1936
+
index.vectorIndexes[prop].vectors[id] = [
1937
+
magnitude,
1938
+
value
1939
+
];
1940
+
}
1941
+
__name(insertVector, "insertVector");
1942
+
async function removeScalar(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount) {
1943
+
const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);
1944
+
if (isVectorType(schemaType)) {
1945
+
delete index.vectorIndexes[prop].vectors[id];
1946
+
return true;
1947
+
}
1948
+
const { type, node } = index.indexes[prop];
1949
+
switch (type) {
1950
+
case "AVL": {
1951
+
removeDocument(node, internalId, value);
1952
+
return true;
1953
+
}
1954
+
case "Bool": {
1955
+
const booleanKey = value ? "true" : "false";
1956
+
const position = node[booleanKey].indexOf(internalId);
1957
+
node[value ? "true" : "false"].splice(position, 1);
1958
+
return true;
1959
+
}
1960
+
case "Radix": {
1961
+
const tokens = await tokenizer.tokenize(value, language, prop);
1962
+
await implementation.removeDocumentScoreParameters(index, prop, id, docsCount);
1963
+
for (const token of tokens) {
1964
+
await implementation.removeTokenScoreParameters(index, prop, token);
1965
+
removeDocumentByWord(node, token, internalId);
1966
+
}
1967
+
return true;
1968
+
}
1969
+
case "Flat": {
1970
+
removeDocument2(node, internalId, value);
1971
+
return true;
1972
+
}
1973
+
case "BKD": {
1974
+
removeDocByID(node, value, internalId);
1975
+
return false;
1976
+
}
1977
+
}
1978
+
}
1979
+
__name(removeScalar, "removeScalar");
1980
+
async function remove3(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount) {
1981
+
if (!isArrayType(schemaType)) {
1982
+
return removeScalar(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount);
1983
+
}
1984
+
const innerSchemaType = getInnerType(schemaType);
1985
+
const elements = value;
1986
+
const elementsLength = elements.length;
1987
+
for (let i = 0; i < elementsLength; i++) {
1988
+
await removeScalar(implementation, index, prop, id, elements[i], innerSchemaType, language, tokenizer, docsCount);
1989
+
}
1990
+
return true;
1991
+
}
1992
+
__name(remove3, "remove");
1993
+
async function search(context, index, prop, term) {
1994
+
if (!(prop in index.tokenOccurrences)) {
1995
+
return [];
1996
+
}
1997
+
const { node, type } = index.indexes[prop];
1998
+
if (type !== "Radix") {
1999
+
throw createError("WRONG_SEARCH_PROPERTY_TYPE", prop);
2000
+
}
2001
+
const { exact, tolerance } = context.params;
2002
+
const searchResult = find2(node, {
2003
+
term,
2004
+
exact,
2005
+
tolerance
2006
+
});
2007
+
const ids = /* @__PURE__ */ new Set();
2008
+
for (const key in searchResult) {
2009
+
const ownProperty = getOwnProperty(searchResult, key);
2010
+
if (!ownProperty) continue;
2011
+
for (const id of searchResult[key]) {
2012
+
ids.add(id);
2013
+
}
2014
+
}
2015
+
return context.index.calculateResultScores(context, index, prop, term, Array.from(ids));
2016
+
}
2017
+
__name(search, "search");
2018
+
async function searchByWhereClause(context, index, filters) {
2019
+
const filterKeys = Object.keys(filters);
2020
+
const filtersMap = filterKeys.reduce((acc, key) => ({
2021
+
[key]: [],
2022
+
...acc
2023
+
}), {});
2024
+
for (const param of filterKeys) {
2025
+
const operation = filters[param];
2026
+
if (typeof index.indexes[param] === "undefined") {
2027
+
throw createError("UNKNOWN_FILTER_PROPERTY", param);
2028
+
}
2029
+
const { node, type, isArray } = index.indexes[param];
2030
+
if (type === "Bool") {
2031
+
const idx = node;
2032
+
const filteredIDs = idx[operation.toString()];
2033
+
safeArrayPush(filtersMap[param], filteredIDs);
2034
+
continue;
2035
+
}
2036
+
if (type === "BKD") {
2037
+
let reqOperation;
2038
+
if ("radius" in operation) {
2039
+
reqOperation = "radius";
2040
+
} else if ("polygon" in operation) {
2041
+
reqOperation = "polygon";
2042
+
} else {
2043
+
throw new Error(`Invalid operation ${operation}`);
2044
+
}
2045
+
if (reqOperation === "radius") {
2046
+
const { value, coordinates, unit = "m", inside = true, highPrecision = false } = operation[reqOperation];
2047
+
const distanceInMeters = convertDistanceToMeters(value, unit);
2048
+
const ids = searchByRadius(node.root, coordinates, distanceInMeters, inside, void 0, highPrecision);
2049
+
safeArrayPush(filtersMap[param], ids.map(({ docIDs }) => docIDs).flat());
2050
+
} else {
2051
+
const { coordinates, inside = true, highPrecision = false } = operation[reqOperation];
2052
+
const ids = searchByPolygon(node.root, coordinates, inside, void 0, highPrecision);
2053
+
safeArrayPush(filtersMap[param], ids.map(({ docIDs }) => docIDs).flat());
2054
+
}
2055
+
continue;
2056
+
}
2057
+
if (type === "Radix" && (typeof operation === "string" || Array.isArray(operation))) {
2058
+
for (const raw of [
2059
+
operation
2060
+
].flat()) {
2061
+
const term = await context.tokenizer.tokenize(raw, context.language, param);
2062
+
for (const t of term) {
2063
+
const filteredIDsResults = find2(node, {
2064
+
term: t,
2065
+
exact: true
2066
+
});
2067
+
safeArrayPush(filtersMap[param], Object.values(filteredIDsResults).flat());
2068
+
}
2069
+
}
2070
+
continue;
2071
+
}
2072
+
const operationKeys = Object.keys(operation);
2073
+
if (operationKeys.length > 1) {
2074
+
throw createError("INVALID_FILTER_OPERATION", operationKeys.length);
2075
+
}
2076
+
if (type === "Flat") {
2077
+
if (isArray) {
2078
+
safeArrayPush(filtersMap[param], filterArr(node, operation));
2079
+
} else {
2080
+
safeArrayPush(filtersMap[param], filter(node, operation));
2081
+
}
2082
+
continue;
2083
+
}
2084
+
if (type === "AVL") {
2085
+
const operationOpt = operationKeys[0];
2086
+
const operationValue = operation[operationOpt];
2087
+
let filteredIDs = [];
2088
+
switch (operationOpt) {
2089
+
case "gt": {
2090
+
filteredIDs = greaterThan(node, operationValue, false);
2091
+
break;
2092
+
}
2093
+
case "gte": {
2094
+
filteredIDs = greaterThan(node, operationValue, true);
2095
+
break;
2096
+
}
2097
+
case "lt": {
2098
+
filteredIDs = lessThan(node, operationValue, false);
2099
+
break;
2100
+
}
2101
+
case "lte": {
2102
+
filteredIDs = lessThan(node, operationValue, true);
2103
+
break;
2104
+
}
2105
+
case "eq": {
2106
+
filteredIDs = find(node, operationValue) ?? [];
2107
+
break;
2108
+
}
2109
+
case "between": {
2110
+
const [min, max] = operationValue;
2111
+
filteredIDs = rangeSearch(node, min, max);
2112
+
break;
2113
+
}
2114
+
}
2115
+
safeArrayPush(filtersMap[param], filteredIDs);
2116
+
}
2117
+
}
2118
+
const result = intersect(Object.values(filtersMap));
2119
+
return result;
2120
+
}
2121
+
__name(searchByWhereClause, "searchByWhereClause");
2122
+
async function getSearchableProperties(index) {
2123
+
return index.searchableProperties;
2124
+
}
2125
+
__name(getSearchableProperties, "getSearchableProperties");
2126
+
async function getSearchablePropertiesWithTypes(index) {
2127
+
return index.searchablePropertiesWithTypes;
2128
+
}
2129
+
__name(getSearchablePropertiesWithTypes, "getSearchablePropertiesWithTypes");
2130
+
function loadRadixNode(node) {
2131
+
const convertedNode = create4(node.e, node.s, node.k);
2132
+
convertedNode.d = node.d;
2133
+
convertedNode.w = node.w;
2134
+
for (const childrenKey of Object.keys(node.c)) {
2135
+
convertedNode.c[childrenKey] = loadRadixNode(node.c[childrenKey]);
2136
+
}
2137
+
return convertedNode;
2138
+
}
2139
+
__name(loadRadixNode, "loadRadixNode");
2140
+
function loadFlatNode(node) {
2141
+
return {
2142
+
numberToDocumentId: new Map(node)
2143
+
};
2144
+
}
2145
+
__name(loadFlatNode, "loadFlatNode");
2146
+
function saveFlatNode(node) {
2147
+
return Array.from(node.numberToDocumentId.entries());
2148
+
}
2149
+
__name(saveFlatNode, "saveFlatNode");
2150
+
async function load3(sharedInternalDocumentStore, raw) {
2151
+
const { indexes: rawIndexes, vectorIndexes: rawVectorIndexes, searchableProperties, searchablePropertiesWithTypes, frequencies, tokenOccurrences, avgFieldLength, fieldLengths } = raw;
2152
+
const indexes = {};
2153
+
const vectorIndexes = {};
2154
+
for (const prop of Object.keys(rawIndexes)) {
2155
+
const { node, type, isArray } = rawIndexes[prop];
2156
+
switch (type) {
2157
+
case "Radix":
2158
+
indexes[prop] = {
2159
+
type: "Radix",
2160
+
node: loadRadixNode(node),
2161
+
isArray
2162
+
};
2163
+
break;
2164
+
case "Flat":
2165
+
indexes[prop] = {
2166
+
type: "Flat",
2167
+
node: loadFlatNode(node),
2168
+
isArray
2169
+
};
2170
+
break;
2171
+
default:
2172
+
indexes[prop] = rawIndexes[prop];
2173
+
}
2174
+
}
2175
+
for (const idx of Object.keys(rawVectorIndexes)) {
2176
+
const vectors = rawVectorIndexes[idx].vectors;
2177
+
for (const vec in vectors) {
2178
+
vectors[vec] = [
2179
+
vectors[vec][0],
2180
+
new Float32Array(vectors[vec][1])
2181
+
];
2182
+
}
2183
+
vectorIndexes[idx] = {
2184
+
size: rawVectorIndexes[idx].size,
2185
+
vectors
2186
+
};
2187
+
}
2188
+
return {
2189
+
sharedInternalDocumentStore,
2190
+
indexes,
2191
+
vectorIndexes,
2192
+
searchableProperties,
2193
+
searchablePropertiesWithTypes,
2194
+
frequencies,
2195
+
tokenOccurrences,
2196
+
avgFieldLength,
2197
+
fieldLengths
2198
+
};
2199
+
}
2200
+
__name(load3, "load");
2201
+
async function save3(index) {
2202
+
const { indexes, vectorIndexes, searchableProperties, searchablePropertiesWithTypes, frequencies, tokenOccurrences, avgFieldLength, fieldLengths } = index;
2203
+
const vectorIndexesAsArrays = {};
2204
+
for (const idx of Object.keys(vectorIndexes)) {
2205
+
const vectors = vectorIndexes[idx].vectors;
2206
+
for (const vec in vectors) {
2207
+
vectors[vec] = [
2208
+
vectors[vec][0],
2209
+
Array.from(vectors[vec][1])
2210
+
];
2211
+
}
2212
+
vectorIndexesAsArrays[idx] = {
2213
+
size: vectorIndexes[idx].size,
2214
+
vectors
2215
+
};
2216
+
}
2217
+
const savedIndexes = {};
2218
+
for (const name of Object.keys(indexes)) {
2219
+
const { type, node, isArray } = indexes[name];
2220
+
if (type !== "Flat") {
2221
+
savedIndexes[name] = indexes[name];
2222
+
continue;
2223
+
}
2224
+
savedIndexes[name] = {
2225
+
type: "Flat",
2226
+
node: saveFlatNode(node),
2227
+
isArray
2228
+
};
2229
+
}
2230
+
return {
2231
+
indexes: savedIndexes,
2232
+
vectorIndexes: vectorIndexesAsArrays,
2233
+
searchableProperties,
2234
+
searchablePropertiesWithTypes,
2235
+
frequencies,
2236
+
tokenOccurrences,
2237
+
avgFieldLength,
2238
+
fieldLengths
2239
+
};
2240
+
}
2241
+
__name(save3, "save");
2242
+
async function createIndex() {
2243
+
return {
2244
+
create: create6,
2245
+
insert: insert5,
2246
+
remove: remove3,
2247
+
insertDocumentScoreParameters,
2248
+
insertTokenScoreParameters,
2249
+
removeDocumentScoreParameters,
2250
+
removeTokenScoreParameters,
2251
+
calculateResultScores,
2252
+
search,
2253
+
searchByWhereClause,
2254
+
getSearchableProperties,
2255
+
getSearchablePropertiesWithTypes,
2256
+
load: load3,
2257
+
save: save3
2258
+
};
2259
+
}
2260
+
__name(createIndex, "createIndex");
2261
+
2262
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/sorter.ts
2263
+
function innerCreate(orama, sharedInternalDocumentStore, schema, sortableDeniedProperties, prefix) {
2264
+
const sorter = {
2265
+
language: orama.tokenizer.language,
2266
+
sharedInternalDocumentStore,
2267
+
enabled: true,
2268
+
isSorted: true,
2269
+
sortableProperties: [],
2270
+
sortablePropertiesWithTypes: {},
2271
+
sorts: {}
2272
+
};
2273
+
for (const [prop, type] of Object.entries(schema)) {
2274
+
const path = `${prefix}${prefix ? "." : ""}${prop}`;
2275
+
if (sortableDeniedProperties.includes(path)) {
2276
+
continue;
2277
+
}
2278
+
if (typeof type === "object" && !Array.isArray(type)) {
2279
+
const ret = innerCreate(orama, sharedInternalDocumentStore, type, sortableDeniedProperties, path);
2280
+
safeArrayPush(sorter.sortableProperties, ret.sortableProperties);
2281
+
sorter.sorts = {
2282
+
...sorter.sorts,
2283
+
...ret.sorts
2284
+
};
2285
+
sorter.sortablePropertiesWithTypes = {
2286
+
...sorter.sortablePropertiesWithTypes,
2287
+
...ret.sortablePropertiesWithTypes
2288
+
};
2289
+
continue;
2290
+
}
2291
+
if (!isVectorType(type)) {
2292
+
switch (type) {
2293
+
case "boolean":
2294
+
case "number":
2295
+
case "string":
2296
+
sorter.sortableProperties.push(path);
2297
+
sorter.sortablePropertiesWithTypes[path] = type;
2298
+
sorter.sorts[path] = {
2299
+
docs: /* @__PURE__ */ new Map(),
2300
+
orderedDocsToRemove: /* @__PURE__ */ new Map(),
2301
+
orderedDocs: [],
2302
+
type
2303
+
};
2304
+
break;
2305
+
case "geopoint":
2306
+
case "enum":
2307
+
continue;
2308
+
case "enum[]":
2309
+
case "boolean[]":
2310
+
case "number[]":
2311
+
case "string[]":
2312
+
continue;
2313
+
default:
2314
+
throw createError("INVALID_SORT_SCHEMA_TYPE", Array.isArray(type) ? "array" : type, path);
2315
+
}
2316
+
}
2317
+
}
2318
+
return sorter;
2319
+
}
2320
+
__name(innerCreate, "innerCreate");
2321
+
async function create7(orama, sharedInternalDocumentStore, schema, config) {
2322
+
const isSortEnabled = config?.enabled !== false;
2323
+
if (!isSortEnabled) {
2324
+
return {
2325
+
disabled: true
2326
+
};
2327
+
}
2328
+
return innerCreate(orama, sharedInternalDocumentStore, schema, (config || {}).unsortableProperties || [], "");
2329
+
}
2330
+
__name(create7, "create");
2331
+
async function insert6(sorter, prop, id, value) {
2332
+
if (!sorter.enabled) {
2333
+
return;
2334
+
}
2335
+
sorter.isSorted = false;
2336
+
const internalId = getInternalDocumentId(sorter.sharedInternalDocumentStore, id);
2337
+
const s = sorter.sorts[prop];
2338
+
if (s.orderedDocsToRemove.has(internalId)) {
2339
+
ensureOrderedDocsAreDeletedByProperty(sorter, prop);
2340
+
}
2341
+
s.docs.set(internalId, s.orderedDocs.length);
2342
+
s.orderedDocs.push([
2343
+
internalId,
2344
+
value
2345
+
]);
2346
+
}
2347
+
__name(insert6, "insert");
2348
+
function ensureIsSorted(sorter) {
2349
+
if (sorter.isSorted) {
2350
+
return;
2351
+
}
2352
+
if (!sorter.enabled) {
2353
+
return;
2354
+
}
2355
+
const properties = Object.keys(sorter.sorts);
2356
+
for (const prop of properties) {
2357
+
ensurePropertyIsSorted(sorter, prop);
2358
+
}
2359
+
sorter.isSorted = true;
2360
+
}
2361
+
__name(ensureIsSorted, "ensureIsSorted");
2362
+
function stringSort(language, value, d) {
2363
+
return value[1].localeCompare(d[1], getLocale(language));
2364
+
}
2365
+
__name(stringSort, "stringSort");
2366
+
function numberSort(value, d) {
2367
+
return value[1] - d[1];
2368
+
}
2369
+
__name(numberSort, "numberSort");
2370
+
function booleanSort(value, d) {
2371
+
return d[1] ? -1 : 1;
2372
+
}
2373
+
__name(booleanSort, "booleanSort");
2374
+
function ensurePropertyIsSorted(sorter, prop) {
2375
+
const s = sorter.sorts[prop];
2376
+
let predicate;
2377
+
switch (s.type) {
2378
+
case "string":
2379
+
predicate = stringSort.bind(null, sorter.language);
2380
+
break;
2381
+
case "number":
2382
+
predicate = numberSort.bind(null);
2383
+
break;
2384
+
case "boolean":
2385
+
predicate = booleanSort.bind(null);
2386
+
break;
2387
+
}
2388
+
s.orderedDocs.sort(predicate);
2389
+
const orderedDocsLength = s.orderedDocs.length;
2390
+
for (let i = 0; i < orderedDocsLength; i++) {
2391
+
const docId = s.orderedDocs[i][0];
2392
+
s.docs.set(docId, i);
2393
+
}
2394
+
}
2395
+
__name(ensurePropertyIsSorted, "ensurePropertyIsSorted");
2396
+
function ensureOrderedDocsAreDeleted(sorter) {
2397
+
const properties = Object.keys(sorter.sorts);
2398
+
for (const prop of properties) {
2399
+
ensureOrderedDocsAreDeletedByProperty(sorter, prop);
2400
+
}
2401
+
}
2402
+
__name(ensureOrderedDocsAreDeleted, "ensureOrderedDocsAreDeleted");
2403
+
function ensureOrderedDocsAreDeletedByProperty(sorter, prop) {
2404
+
const s = sorter.sorts[prop];
2405
+
if (!s.orderedDocsToRemove.size) return;
2406
+
s.orderedDocs = s.orderedDocs.filter((doc) => !s.orderedDocsToRemove.has(doc[0]));
2407
+
s.orderedDocsToRemove.clear();
2408
+
}
2409
+
__name(ensureOrderedDocsAreDeletedByProperty, "ensureOrderedDocsAreDeletedByProperty");
2410
+
async function remove4(sorter, prop, id) {
2411
+
if (!sorter.enabled) {
2412
+
return;
2413
+
}
2414
+
const s = sorter.sorts[prop];
2415
+
const internalId = getInternalDocumentId(sorter.sharedInternalDocumentStore, id);
2416
+
const index = s.docs.get(internalId);
2417
+
if (!index) return;
2418
+
s.docs.delete(internalId);
2419
+
s.orderedDocsToRemove.set(internalId, true);
2420
+
}
2421
+
__name(remove4, "remove");
2422
+
async function sortBy(sorter, docIds, by) {
2423
+
if (!sorter.enabled) {
2424
+
throw createError("SORT_DISABLED");
2425
+
}
2426
+
const property = by.property;
2427
+
const isDesc = by.order === "DESC";
2428
+
const s = sorter.sorts[property];
2429
+
if (!s) {
2430
+
throw createError("UNABLE_TO_SORT_ON_UNKNOWN_FIELD", property, sorter.sortableProperties.join(", "));
2431
+
}
2432
+
ensureOrderedDocsAreDeletedByProperty(sorter, property);
2433
+
ensureIsSorted(sorter);
2434
+
docIds.sort((a, b) => {
2435
+
const indexOfA = s.docs.get(getInternalDocumentId(sorter.sharedInternalDocumentStore, a[0]));
2436
+
const indexOfB = s.docs.get(getInternalDocumentId(sorter.sharedInternalDocumentStore, b[0]));
2437
+
const isAIndexed = typeof indexOfA !== "undefined";
2438
+
const isBIndexed = typeof indexOfB !== "undefined";
2439
+
if (!isAIndexed && !isBIndexed) {
2440
+
return 0;
2441
+
}
2442
+
if (!isAIndexed) {
2443
+
return 1;
2444
+
}
2445
+
if (!isBIndexed) {
2446
+
return -1;
2447
+
}
2448
+
return isDesc ? indexOfB - indexOfA : indexOfA - indexOfB;
2449
+
});
2450
+
return docIds;
2451
+
}
2452
+
__name(sortBy, "sortBy");
2453
+
async function getSortableProperties(sorter) {
2454
+
if (!sorter.enabled) {
2455
+
return [];
2456
+
}
2457
+
return sorter.sortableProperties;
2458
+
}
2459
+
__name(getSortableProperties, "getSortableProperties");
2460
+
async function getSortablePropertiesWithTypes(sorter) {
2461
+
if (!sorter.enabled) {
2462
+
return {};
2463
+
}
2464
+
return sorter.sortablePropertiesWithTypes;
2465
+
}
2466
+
__name(getSortablePropertiesWithTypes, "getSortablePropertiesWithTypes");
2467
+
async function load4(sharedInternalDocumentStore, raw) {
2468
+
const rawDocument = raw;
2469
+
if (!rawDocument.enabled) {
2470
+
return {
2471
+
enabled: false
2472
+
};
2473
+
}
2474
+
const sorts = Object.keys(rawDocument.sorts).reduce((acc, prop) => {
2475
+
const { docs, orderedDocs, type } = rawDocument.sorts[prop];
2476
+
acc[prop] = {
2477
+
docs: new Map(Object.entries(docs).map(([k, v2]) => [
2478
+
+k,
2479
+
v2
2480
+
])),
2481
+
orderedDocsToRemove: /* @__PURE__ */ new Map(),
2482
+
orderedDocs,
2483
+
type
2484
+
};
2485
+
return acc;
2486
+
}, {});
2487
+
return {
2488
+
sharedInternalDocumentStore,
2489
+
language: rawDocument.language,
2490
+
sortableProperties: rawDocument.sortableProperties,
2491
+
sortablePropertiesWithTypes: rawDocument.sortablePropertiesWithTypes,
2492
+
sorts,
2493
+
enabled: true,
2494
+
isSorted: rawDocument.isSorted
2495
+
};
2496
+
}
2497
+
__name(load4, "load");
2498
+
async function save4(sorter) {
2499
+
if (!sorter.enabled) {
2500
+
return {
2501
+
enabled: false
2502
+
};
2503
+
}
2504
+
ensureOrderedDocsAreDeleted(sorter);
2505
+
ensureIsSorted(sorter);
2506
+
const sorts = Object.keys(sorter.sorts).reduce((acc, prop) => {
2507
+
const { docs, orderedDocs, type } = sorter.sorts[prop];
2508
+
acc[prop] = {
2509
+
docs: Object.fromEntries(docs.entries()),
2510
+
orderedDocs,
2511
+
type
2512
+
};
2513
+
return acc;
2514
+
}, {});
2515
+
return {
2516
+
language: sorter.language,
2517
+
sortableProperties: sorter.sortableProperties,
2518
+
sortablePropertiesWithTypes: sorter.sortablePropertiesWithTypes,
2519
+
sorts,
2520
+
enabled: sorter.enabled,
2521
+
isSorted: sorter.isSorted
2522
+
};
2523
+
}
2524
+
__name(save4, "save");
2525
+
async function createSorter() {
2526
+
return {
2527
+
create: create7,
2528
+
insert: insert6,
2529
+
remove: remove4,
2530
+
save: save4,
2531
+
load: load4,
2532
+
sortBy,
2533
+
getSortableProperties,
2534
+
getSortablePropertiesWithTypes
2535
+
};
2536
+
}
2537
+
__name(createSorter, "createSorter");
2538
+
2539
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/tokenizer/diacritics.ts
2540
+
var DIACRITICS_CHARCODE_START = 192;
2541
+
var DIACRITICS_CHARCODE_END = 383;
2542
+
var CHARCODE_REPLACE_MAPPING = [
2543
+
65,
2544
+
65,
2545
+
65,
2546
+
65,
2547
+
65,
2548
+
65,
2549
+
65,
2550
+
67,
2551
+
69,
2552
+
69,
2553
+
69,
2554
+
69,
2555
+
73,
2556
+
73,
2557
+
73,
2558
+
73,
2559
+
69,
2560
+
78,
2561
+
79,
2562
+
79,
2563
+
79,
2564
+
79,
2565
+
79,
2566
+
null,
2567
+
79,
2568
+
85,
2569
+
85,
2570
+
85,
2571
+
85,
2572
+
89,
2573
+
80,
2574
+
115,
2575
+
97,
2576
+
97,
2577
+
97,
2578
+
97,
2579
+
97,
2580
+
97,
2581
+
97,
2582
+
99,
2583
+
101,
2584
+
101,
2585
+
101,
2586
+
101,
2587
+
105,
2588
+
105,
2589
+
105,
2590
+
105,
2591
+
101,
2592
+
110,
2593
+
111,
2594
+
111,
2595
+
111,
2596
+
111,
2597
+
111,
2598
+
null,
2599
+
111,
2600
+
117,
2601
+
117,
2602
+
117,
2603
+
117,
2604
+
121,
2605
+
112,
2606
+
121,
2607
+
65,
2608
+
97,
2609
+
65,
2610
+
97,
2611
+
65,
2612
+
97,
2613
+
67,
2614
+
99,
2615
+
67,
2616
+
99,
2617
+
67,
2618
+
99,
2619
+
67,
2620
+
99,
2621
+
68,
2622
+
100,
2623
+
68,
2624
+
100,
2625
+
69,
2626
+
101,
2627
+
69,
2628
+
101,
2629
+
69,
2630
+
101,
2631
+
69,
2632
+
101,
2633
+
69,
2634
+
101,
2635
+
71,
2636
+
103,
2637
+
71,
2638
+
103,
2639
+
71,
2640
+
103,
2641
+
71,
2642
+
103,
2643
+
72,
2644
+
104,
2645
+
72,
2646
+
104,
2647
+
73,
2648
+
105,
2649
+
73,
2650
+
105,
2651
+
73,
2652
+
105,
2653
+
73,
2654
+
105,
2655
+
73,
2656
+
105,
2657
+
73,
2658
+
105,
2659
+
74,
2660
+
106,
2661
+
75,
2662
+
107,
2663
+
107,
2664
+
76,
2665
+
108,
2666
+
76,
2667
+
108,
2668
+
76,
2669
+
108,
2670
+
76,
2671
+
108,
2672
+
76,
2673
+
108,
2674
+
78,
2675
+
110,
2676
+
78,
2677
+
110,
2678
+
78,
2679
+
110,
2680
+
110,
2681
+
78,
2682
+
110,
2683
+
79,
2684
+
111,
2685
+
79,
2686
+
111,
2687
+
79,
2688
+
111,
2689
+
79,
2690
+
111,
2691
+
82,
2692
+
114,
2693
+
82,
2694
+
114,
2695
+
82,
2696
+
114,
2697
+
83,
2698
+
115,
2699
+
83,
2700
+
115,
2701
+
83,
2702
+
115,
2703
+
83,
2704
+
115,
2705
+
84,
2706
+
116,
2707
+
84,
2708
+
116,
2709
+
84,
2710
+
116,
2711
+
85,
2712
+
117,
2713
+
85,
2714
+
117,
2715
+
85,
2716
+
117,
2717
+
85,
2718
+
117,
2719
+
85,
2720
+
117,
2721
+
85,
2722
+
117,
2723
+
87,
2724
+
119,
2725
+
89,
2726
+
121,
2727
+
89,
2728
+
90,
2729
+
122,
2730
+
90,
2731
+
122,
2732
+
90,
2733
+
122,
2734
+
115
2735
+
];
2736
+
function replaceChar(charCode) {
2737
+
if (charCode < DIACRITICS_CHARCODE_START || charCode > DIACRITICS_CHARCODE_END) return charCode;
2738
+
return CHARCODE_REPLACE_MAPPING[charCode - DIACRITICS_CHARCODE_START] || charCode;
2739
+
}
2740
+
__name(replaceChar, "replaceChar");
2741
+
function replaceDiacritics(str) {
2742
+
const stringCharCode = [];
2743
+
for (let idx = 0; idx < str.length; idx++) {
2744
+
stringCharCode[idx] = replaceChar(str.charCodeAt(idx));
2745
+
}
2746
+
return String.fromCharCode(...stringCharCode);
2747
+
}
2748
+
__name(replaceDiacritics, "replaceDiacritics");
2749
+
2750
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/tokenizer/english-stemmer.ts
2751
+
var step2List = {
2752
+
ational: "ate",
2753
+
tional: "tion",
2754
+
enci: "ence",
2755
+
anci: "ance",
2756
+
izer: "ize",
2757
+
bli: "ble",
2758
+
alli: "al",
2759
+
entli: "ent",
2760
+
eli: "e",
2761
+
ousli: "ous",
2762
+
ization: "ize",
2763
+
ation: "ate",
2764
+
ator: "ate",
2765
+
alism: "al",
2766
+
iveness: "ive",
2767
+
fulness: "ful",
2768
+
ousness: "ous",
2769
+
aliti: "al",
2770
+
iviti: "ive",
2771
+
biliti: "ble",
2772
+
logi: "log"
2773
+
};
2774
+
var step3List = {
2775
+
icate: "ic",
2776
+
ative: "",
2777
+
alize: "al",
2778
+
iciti: "ic",
2779
+
ical: "ic",
2780
+
ful: "",
2781
+
ness: ""
2782
+
};
2783
+
var c = "[^aeiou]";
2784
+
var v = "[aeiouy]";
2785
+
var C = c + "[^aeiouy]*";
2786
+
var V = v + "[aeiou]*";
2787
+
var mgr0 = "^(" + C + ")?" + V + C;
2788
+
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";
2789
+
var mgr1 = "^(" + C + ")?" + V + C + V + C;
2790
+
var s_v = "^(" + C + ")?" + v;
2791
+
function stemmer(w) {
2792
+
let stem;
2793
+
let suffix;
2794
+
let re;
2795
+
let re2;
2796
+
let re3;
2797
+
let re4;
2798
+
if (w.length < 3) {
2799
+
return w;
2800
+
}
2801
+
const firstch = w.substring(0, 1);
2802
+
if (firstch == "y") {
2803
+
w = firstch.toUpperCase() + w.substring(1);
2804
+
}
2805
+
re = /^(.+?)(ss|i)es$/;
2806
+
re2 = /^(.+?)([^s])s$/;
2807
+
if (re.test(w)) {
2808
+
w = w.replace(re, "$1$2");
2809
+
} else if (re2.test(w)) {
2810
+
w = w.replace(re2, "$1$2");
2811
+
}
2812
+
re = /^(.+?)eed$/;
2813
+
re2 = /^(.+?)(ed|ing)$/;
2814
+
if (re.test(w)) {
2815
+
const fp = re.exec(w);
2816
+
re = new RegExp(mgr0);
2817
+
if (re.test(fp[1])) {
2818
+
re = /.$/;
2819
+
w = w.replace(re, "");
2820
+
}
2821
+
} else if (re2.test(w)) {
2822
+
const fp = re2.exec(w);
2823
+
stem = fp[1];
2824
+
re2 = new RegExp(s_v);
2825
+
if (re2.test(stem)) {
2826
+
w = stem;
2827
+
re2 = /(at|bl|iz)$/;
2828
+
re3 = new RegExp("([^aeiouylsz])\\1$");
2829
+
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
2830
+
if (re2.test(w)) {
2831
+
w = w + "e";
2832
+
} else if (re3.test(w)) {
2833
+
re = /.$/;
2834
+
w = w.replace(re, "");
2835
+
} else if (re4.test(w)) {
2836
+
w = w + "e";
2837
+
}
2838
+
}
2839
+
}
2840
+
re = /^(.+?)y$/;
2841
+
if (re.test(w)) {
2842
+
const fp = re.exec(w);
2843
+
stem = fp?.[1];
2844
+
re = new RegExp(s_v);
2845
+
if (stem && re.test(stem)) {
2846
+
w = stem + "i";
2847
+
}
2848
+
}
2849
+
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
2850
+
if (re.test(w)) {
2851
+
const fp = re.exec(w);
2852
+
stem = fp?.[1];
2853
+
suffix = fp?.[2];
2854
+
re = new RegExp(mgr0);
2855
+
if (stem && re.test(stem)) {
2856
+
w = stem + step2List[suffix];
2857
+
}
2858
+
}
2859
+
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
2860
+
if (re.test(w)) {
2861
+
const fp = re.exec(w);
2862
+
stem = fp?.[1];
2863
+
suffix = fp?.[2];
2864
+
re = new RegExp(mgr0);
2865
+
if (stem && re.test(stem)) {
2866
+
w = stem + step3List[suffix];
2867
+
}
2868
+
}
2869
+
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
2870
+
re2 = /^(.+?)(s|t)(ion)$/;
2871
+
if (re.test(w)) {
2872
+
const fp = re.exec(w);
2873
+
stem = fp?.[1];
2874
+
re = new RegExp(mgr1);
2875
+
if (stem && re.test(stem)) {
2876
+
w = stem;
2877
+
}
2878
+
} else if (re2.test(w)) {
2879
+
const fp = re2.exec(w);
2880
+
stem = fp?.[1] ?? "" + fp?.[2] ?? "";
2881
+
re2 = new RegExp(mgr1);
2882
+
if (re2.test(stem)) {
2883
+
w = stem;
2884
+
}
2885
+
}
2886
+
re = /^(.+?)e$/;
2887
+
if (re.test(w)) {
2888
+
const fp = re.exec(w);
2889
+
stem = fp?.[1];
2890
+
re = new RegExp(mgr1);
2891
+
re2 = new RegExp(meq1);
2892
+
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
2893
+
if (stem && (re.test(stem) || re2.test(stem) && !re3.test(stem))) {
2894
+
w = stem;
2895
+
}
2896
+
}
2897
+
re = /ll$/;
2898
+
re2 = new RegExp(mgr1);
2899
+
if (re.test(w) && re2.test(w)) {
2900
+
re = /.$/;
2901
+
w = w.replace(re, "");
2902
+
}
2903
+
if (firstch == "y") {
2904
+
w = firstch.toLowerCase() + w.substring(1);
2905
+
}
2906
+
return w;
2907
+
}
2908
+
__name(stemmer, "stemmer");
2909
+
2910
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/tokenizer/index.ts
2911
+
function normalizeToken(prop, token) {
2912
+
const key = `${this.language}:${prop}:${token}`;
2913
+
if (this.normalizationCache.has(key)) {
2914
+
return this.normalizationCache.get(key);
2915
+
}
2916
+
if (this.stopWords?.includes(token)) {
2917
+
this.normalizationCache.set(key, "");
2918
+
return "";
2919
+
}
2920
+
if (this.stemmer && !this.stemmerSkipProperties.has(prop)) {
2921
+
token = this.stemmer(token);
2922
+
}
2923
+
token = replaceDiacritics(token);
2924
+
this.normalizationCache.set(key, token);
2925
+
return token;
2926
+
}
2927
+
__name(normalizeToken, "normalizeToken");
2928
+
function trim(text) {
2929
+
while (text[text.length - 1] === "") {
2930
+
text.pop();
2931
+
}
2932
+
while (text[0] === "") {
2933
+
text.shift();
2934
+
}
2935
+
return text;
2936
+
}
2937
+
__name(trim, "trim");
2938
+
function tokenize(input, language, prop) {
2939
+
if (language && language !== this.language) {
2940
+
throw createError("LANGUAGE_NOT_SUPPORTED", language);
2941
+
}
2942
+
if (typeof input !== "string") {
2943
+
return [
2944
+
input
2945
+
];
2946
+
}
2947
+
let tokens;
2948
+
if (prop && this.tokenizeSkipProperties.has(prop)) {
2949
+
tokens = [
2950
+
this.normalizeToken.bind(this, prop ?? "")(input)
2951
+
];
2952
+
} else {
2953
+
const splitRule = SPLITTERS[this.language];
2954
+
tokens = input.toLowerCase().split(splitRule).map(this.normalizeToken.bind(this, prop ?? "")).filter(Boolean);
2955
+
}
2956
+
const trimTokens = trim(tokens);
2957
+
if (!this.allowDuplicates) {
2958
+
return Array.from(new Set(trimTokens));
2959
+
}
2960
+
return trimTokens;
2961
+
}
2962
+
__name(tokenize, "tokenize");
2963
+
async function createTokenizer(config = {}) {
2964
+
if (!config.language) {
2965
+
config.language = "english";
2966
+
} else if (!SUPPORTED_LANGUAGES.includes(config.language)) {
2967
+
throw createError("LANGUAGE_NOT_SUPPORTED", config.language);
2968
+
}
2969
+
let stemmer2;
2970
+
if (config.stemming || config.stemmer && !("stemming" in config)) {
2971
+
if (config.stemmer) {
2972
+
if (typeof config.stemmer !== "function") {
2973
+
throw createError("INVALID_STEMMER_FUNCTION_TYPE");
2974
+
}
2975
+
stemmer2 = config.stemmer;
2976
+
} else {
2977
+
if (config.language === "english") {
2978
+
stemmer2 = stemmer;
2979
+
} else {
2980
+
throw createError("MISSING_STEMMER", config.language);
2981
+
}
2982
+
}
2983
+
}
2984
+
let stopWords;
2985
+
if (config.stopWords !== false) {
2986
+
stopWords = [];
2987
+
if (Array.isArray(config.stopWords)) {
2988
+
stopWords = config.stopWords;
2989
+
} else if (typeof config.stopWords === "function") {
2990
+
stopWords = await config.stopWords(stopWords);
2991
+
} else if (config.stopWords) {
2992
+
throw createError("CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY");
2993
+
}
2994
+
if (!Array.isArray(stopWords)) {
2995
+
throw createError("CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY");
2996
+
}
2997
+
for (const s of stopWords) {
2998
+
if (typeof s !== "string") {
2999
+
throw createError("CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY");
3000
+
}
3001
+
}
3002
+
}
3003
+
const tokenizer = {
3004
+
tokenize,
3005
+
language: config.language,
3006
+
stemmer: stemmer2,
3007
+
stemmerSkipProperties: new Set(config.stemmerSkipProperties ? [
3008
+
config.stemmerSkipProperties
3009
+
].flat() : []),
3010
+
tokenizeSkipProperties: new Set(config.tokenizeSkipProperties ? [
3011
+
config.tokenizeSkipProperties
3012
+
].flat() : []),
3013
+
stopWords,
3014
+
allowDuplicates: Boolean(config.allowDuplicates),
3015
+
normalizeToken,
3016
+
normalizationCache: /* @__PURE__ */ new Map()
3017
+
};
3018
+
tokenizer.tokenize = tokenize.bind(tokenizer);
3019
+
tokenizer.normalizeToken = normalizeToken;
3020
+
return tokenizer;
3021
+
}
3022
+
__name(createTokenizer, "createTokenizer");
3023
+
3024
+
// https:https://jsr.io/@orama/orama/2.0.6/src/methods/create.ts
3025
+
function validateComponents(components) {
3026
+
const defaultComponents = {
3027
+
formatElapsedTime,
3028
+
getDocumentIndexId,
3029
+
getDocumentProperties,
3030
+
validateSchema
3031
+
};
3032
+
for (const rawKey of FUNCTION_COMPONENTS) {
3033
+
const key = rawKey;
3034
+
if (components[key]) {
3035
+
if (typeof components[key] !== "function") {
3036
+
throw createError("COMPONENT_MUST_BE_FUNCTION", key);
3037
+
}
3038
+
} else {
3039
+
components[key] = defaultComponents[key];
3040
+
}
3041
+
}
3042
+
for (const rawKey of Object.keys(components)) {
3043
+
if (!OBJECT_COMPONENTS.includes(rawKey) && !FUNCTION_COMPONENTS.includes(rawKey)) {
3044
+
throw createError("UNSUPPORTED_COMPONENT", rawKey);
3045
+
}
3046
+
}
3047
+
}
3048
+
__name(validateComponents, "validateComponents");
3049
+
async function create8({ schema, sort, language, components, id, plugins }) {
3050
+
if (!components) {
3051
+
components = {};
3052
+
}
3053
+
if (!id) {
3054
+
id = await uniqueId();
3055
+
}
3056
+
let tokenizer = components.tokenizer;
3057
+
let index = components.index;
3058
+
let documentsStore = components.documentsStore;
3059
+
let sorter = components.sorter;
3060
+
if (!tokenizer) {
3061
+
tokenizer = await createTokenizer({
3062
+
language: language ?? "english"
3063
+
});
3064
+
} else if (!tokenizer.tokenize) {
3065
+
tokenizer = await createTokenizer(tokenizer);
3066
+
} else {
3067
+
const customTokenizer = tokenizer;
3068
+
tokenizer = customTokenizer;
3069
+
}
3070
+
if (components.tokenizer && language) {
3071
+
throw createError("NO_LANGUAGE_WITH_CUSTOM_TOKENIZER");
3072
+
}
3073
+
const internalDocumentStore = createInternalDocumentIDStore();
3074
+
index ||= await createIndex();
3075
+
sorter ||= await createSorter();
3076
+
documentsStore ||= await createDocumentsStore();
3077
+
validateComponents(components);
3078
+
const { getDocumentProperties: getDocumentProperties2, getDocumentIndexId: getDocumentIndexId2, validateSchema: validateSchema2, formatElapsedTime: formatElapsedTime2 } = components;
3079
+
const orama = {
3080
+
data: {},
3081
+
caches: {},
3082
+
schema,
3083
+
tokenizer,
3084
+
index,
3085
+
sorter,
3086
+
documentsStore,
3087
+
internalDocumentIDStore: internalDocumentStore,
3088
+
getDocumentProperties: getDocumentProperties2,
3089
+
getDocumentIndexId: getDocumentIndexId2,
3090
+
validateSchema: validateSchema2,
3091
+
beforeInsert: [],
3092
+
afterInsert: [],
3093
+
beforeRemove: [],
3094
+
afterRemove: [],
3095
+
beforeUpdate: [],
3096
+
afterUpdate: [],
3097
+
beforeSearch: [],
3098
+
afterSearch: [],
3099
+
beforeInsertMultiple: [],
3100
+
afterInsertMultiple: [],
3101
+
beforeRemoveMultiple: [],
3102
+
afterRemoveMultiple: [],
3103
+
afterUpdateMultiple: [],
3104
+
beforeUpdateMultiple: [],
3105
+
formatElapsedTime: formatElapsedTime2,
3106
+
id,
3107
+
plugins
3108
+
};
3109
+
orama.data = {
3110
+
index: await orama.index.create(orama, internalDocumentStore, schema),
3111
+
docs: await orama.documentsStore.create(orama, internalDocumentStore),
3112
+
sorting: await orama.sorter.create(orama, internalDocumentStore, schema, sort)
3113
+
};
3114
+
for (const hook of AVAILABLE_PLUGIN_HOOKS) {
3115
+
orama[hook] = (orama[hook] ?? []).concat(await getAllPluginsByHook(orama, hook));
3116
+
}
3117
+
return orama;
3118
+
}
3119
+
__name(create8, "create");
3120
+
3121
+
// https:https://jsr.io/@orama/orama/2.0.6/src/types.ts
3122
+
var kInsertions = Symbol("orama.insertions");
3123
+
var kRemovals = Symbol("orama.removals");
3124
+
3125
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/sync-blocking-checker.ts
3126
+
var warn = globalThis.process?.emitWarning ?? /* @__PURE__ */ __name(function emitWarning(message, options) {
3127
+
console.warn(`[WARNING] [${options.code}] ${message}`);
3128
+
}, "emitWarning");
3129
+
function trackInsertion(orama) {
3130
+
if (typeof orama[kInsertions] !== "number") {
3131
+
queueMicrotask(() => {
3132
+
orama[kInsertions] = void 0;
3133
+
});
3134
+
orama[kInsertions] = 0;
3135
+
}
3136
+
if (orama[kInsertions] > 1e3) {
3137
+
warn("Orama's insert operation is synchronous. Please avoid inserting a large number of document in a single operation in order not to block the main thread or, in alternative, please use insertMultiple.", {
3138
+
code: "ORAMA0001"
3139
+
});
3140
+
orama[kInsertions] = -1;
3141
+
} else if (orama[kInsertions] >= 0) {
3142
+
orama[kInsertions]++;
3143
+
}
3144
+
}
3145
+
__name(trackInsertion, "trackInsertion");
3146
+
function trackRemoval(orama) {
3147
+
if (typeof orama[kRemovals] !== "number") {
3148
+
queueMicrotask(() => {
3149
+
orama[kRemovals] = void 0;
3150
+
});
3151
+
orama[kRemovals] = 0;
3152
+
}
3153
+
if (orama[kRemovals] > 1e3) {
3154
+
warn("Orama's remove operation is synchronous. Please avoid removing a large number of document in a single operation in order not to block the main thread, in alternative, please use updateMultiple.", {
3155
+
code: "ORAMA0002"
3156
+
});
3157
+
orama[kRemovals] = -1;
3158
+
} else if (orama[kRemovals] >= 0) {
3159
+
orama[kRemovals]++;
3160
+
}
3161
+
}
3162
+
__name(trackRemoval, "trackRemoval");
3163
+
3164
+
// https:https://jsr.io/@orama/orama/2.0.6/src/methods/insert.ts
3165
+
async function insert7(orama, doc, language, skipHooks) {
3166
+
const errorProperty = await orama.validateSchema(doc, orama.schema);
3167
+
if (errorProperty) {
3168
+
throw createError("SCHEMA_VALIDATION_FAILURE", errorProperty);
3169
+
}
3170
+
return innerInsert(orama, doc, language, skipHooks);
3171
+
}
3172
+
__name(insert7, "insert");
3173
+
async function innerInsert(orama, doc, language, skipHooks) {
3174
+
const { index, docs } = orama.data;
3175
+
const id = await orama.getDocumentIndexId(doc);
3176
+
if (typeof id !== "string") {
3177
+
throw createError("DOCUMENT_ID_MUST_BE_STRING", typeof id);
3178
+
}
3179
+
if (!await orama.documentsStore.store(docs, id, doc)) {
3180
+
throw createError("DOCUMENT_ALREADY_EXISTS", id);
3181
+
}
3182
+
const docsCount = await orama.documentsStore.count(docs);
3183
+
if (!skipHooks) {
3184
+
await runSingleHook(orama.beforeInsert, orama, id, doc);
3185
+
}
3186
+
const indexableProperties = await orama.index.getSearchableProperties(index);
3187
+
const indexablePropertiesWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);
3188
+
const indexableValues = await orama.getDocumentProperties(doc, indexableProperties);
3189
+
for (const [key, value] of Object.entries(indexableValues)) {
3190
+
if (typeof value === "undefined") {
3191
+
continue;
3192
+
}
3193
+
const actualType = typeof value;
3194
+
const expectedType = indexablePropertiesWithTypes[key];
3195
+
if (isGeoPointType(expectedType) && typeof value === "object" && typeof value.lon === "number" && typeof value.lat === "number") {
3196
+
continue;
3197
+
}
3198
+
if (isVectorType(expectedType) && Array.isArray(value)) {
3199
+
continue;
3200
+
}
3201
+
if (isArrayType(expectedType) && Array.isArray(value)) {
3202
+
continue;
3203
+
}
3204
+
if ((expectedType === "enum" || expectedType === "enum[]") && (actualType === "string" || actualType === "number")) {
3205
+
continue;
3206
+
}
3207
+
if (actualType !== expectedType) {
3208
+
throw createError("INVALID_DOCUMENT_PROPERTY", key, expectedType, actualType);
3209
+
}
3210
+
}
3211
+
for (const prop of indexableProperties) {
3212
+
const value = indexableValues[prop];
3213
+
if (typeof value === "undefined") {
3214
+
continue;
3215
+
}
3216
+
const expectedType = indexablePropertiesWithTypes[prop];
3217
+
await orama.index.beforeInsert?.(orama.data.index, prop, id, value, expectedType, language, orama.tokenizer, docsCount);
3218
+
await orama.index.insert(orama.index, orama.data.index, prop, id, value, expectedType, language, orama.tokenizer, docsCount);
3219
+
await orama.index.afterInsert?.(orama.data.index, prop, id, value, expectedType, language, orama.tokenizer, docsCount);
3220
+
}
3221
+
const sortableProperties = await orama.sorter.getSortableProperties(orama.data.sorting);
3222
+
const sortablePropertiesWithTypes = await orama.sorter.getSortablePropertiesWithTypes(orama.data.sorting);
3223
+
const sortableValues = await orama.getDocumentProperties(doc, sortableProperties);
3224
+
for (const prop of sortableProperties) {
3225
+
const value = sortableValues[prop];
3226
+
if (typeof value === "undefined") {
3227
+
continue;
3228
+
}
3229
+
const expectedType = sortablePropertiesWithTypes[prop];
3230
+
await orama.sorter.insert(orama.data.sorting, prop, id, value, expectedType, language);
3231
+
}
3232
+
if (!skipHooks) {
3233
+
await runSingleHook(orama.afterInsert, orama, id, doc);
3234
+
}
3235
+
trackInsertion(orama);
3236
+
return id;
3237
+
}
3238
+
__name(innerInsert, "innerInsert");
3239
+
async function insertMultiple(orama, docs, batchSize, language, skipHooks, timeout) {
3240
+
if (!skipHooks) {
3241
+
await runMultipleHook(orama.beforeInsertMultiple, orama, docs);
3242
+
}
3243
+
const docsLength = docs.length;
3244
+
for (let i = 0; i < docsLength; i++) {
3245
+
const errorProperty = await orama.validateSchema(docs[i], orama.schema);
3246
+
if (errorProperty) {
3247
+
throw createError("SCHEMA_VALIDATION_FAILURE", errorProperty);
3248
+
}
3249
+
}
3250
+
return innerInsertMultiple(orama, docs, batchSize, language, skipHooks, timeout);
3251
+
}
3252
+
__name(insertMultiple, "insertMultiple");
3253
+
async function innerInsertMultiple(orama, docs, batchSize, language, skipHooks, timeout) {
3254
+
if (!batchSize) {
3255
+
batchSize = 1e3;
3256
+
}
3257
+
timeout = timeout || 0;
3258
+
const ids = [];
3259
+
await new Promise((resolve, reject) => {
3260
+
let i = 0;
3261
+
async function _insertMultiple() {
3262
+
const batch = docs.slice(i * batchSize, (i + 1) * batchSize);
3263
+
i++;
3264
+
if (!batch.length) {
3265
+
return resolve();
3266
+
}
3267
+
for (const doc of batch) {
3268
+
try {
3269
+
const id = await insert7(orama, doc, language, skipHooks);
3270
+
ids.push(id);
3271
+
} catch (err) {
3272
+
reject(err);
3273
+
}
3274
+
}
3275
+
setTimeout(_insertMultiple, timeout);
3276
+
}
3277
+
__name(_insertMultiple, "_insertMultiple");
3278
+
setTimeout(_insertMultiple, timeout);
3279
+
});
3280
+
if (!skipHooks) {
3281
+
await runMultipleHook(orama.afterInsertMultiple, orama, docs);
3282
+
}
3283
+
return ids;
3284
+
}
3285
+
__name(innerInsertMultiple, "innerInsertMultiple");
3286
+
3287
+
// https:https://jsr.io/@orama/orama/2.0.6/src/methods/remove.ts
3288
+
async function remove5(orama, id, language, skipHooks) {
3289
+
let result = true;
3290
+
const { index, docs } = orama.data;
3291
+
const doc = await orama.documentsStore.get(docs, id);
3292
+
if (!doc) {
3293
+
return false;
3294
+
}
3295
+
const docId = getDocumentIdFromInternalId(orama.internalDocumentIDStore, getInternalDocumentId(orama.internalDocumentIDStore, id));
3296
+
const docsCount = await orama.documentsStore.count(docs);
3297
+
if (!skipHooks) {
3298
+
await runSingleHook(orama.beforeRemove, orama, docId);
3299
+
}
3300
+
const indexableProperties = await orama.index.getSearchableProperties(index);
3301
+
const indexablePropertiesWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);
3302
+
const values = await orama.getDocumentProperties(doc, indexableProperties);
3303
+
for (const prop of indexableProperties) {
3304
+
const value = values[prop];
3305
+
if (typeof value === "undefined") {
3306
+
continue;
3307
+
}
3308
+
const schemaType = indexablePropertiesWithTypes[prop];
3309
+
await orama.index.beforeRemove?.(orama.data.index, prop, docId, value, schemaType, language, orama.tokenizer, docsCount);
3310
+
if (!await orama.index.remove(orama.index, orama.data.index, prop, id, value, schemaType, language, orama.tokenizer, docsCount)) {
3311
+
result = false;
3312
+
}
3313
+
await orama.index.afterRemove?.(orama.data.index, prop, docId, value, schemaType, language, orama.tokenizer, docsCount);
3314
+
}
3315
+
const sortableProperties = await orama.sorter.getSortableProperties(orama.data.sorting);
3316
+
const sortableValues = await orama.getDocumentProperties(doc, sortableProperties);
3317
+
for (const prop of sortableProperties) {
3318
+
if (typeof sortableValues[prop] === "undefined") {
3319
+
continue;
3320
+
}
3321
+
await orama.sorter.remove(orama.data.sorting, prop, id);
3322
+
}
3323
+
if (!skipHooks) {
3324
+
await runSingleHook(orama.afterRemove, orama, docId);
3325
+
}
3326
+
await orama.documentsStore.remove(orama.data.docs, id);
3327
+
trackRemoval(orama);
3328
+
return result;
3329
+
}
3330
+
__name(remove5, "remove");
3331
+
async function removeMultiple(orama, ids, batchSize, language, skipHooks) {
3332
+
let result = 0;
3333
+
if (!batchSize) {
3334
+
batchSize = 1e3;
3335
+
}
3336
+
const docIdsForHooks = skipHooks ? [] : ids.map((id) => getDocumentIdFromInternalId(orama.internalDocumentIDStore, getInternalDocumentId(orama.internalDocumentIDStore, id)));
3337
+
if (!skipHooks) {
3338
+
await runMultipleHook(orama.beforeRemoveMultiple, orama, docIdsForHooks);
3339
+
}
3340
+
await new Promise((resolve, reject) => {
3341
+
let i = 0;
3342
+
async function _insertMultiple() {
3343
+
const batch = ids.slice(i * batchSize, (i + 1) * batchSize);
3344
+
i++;
3345
+
if (!batch.length) {
3346
+
return resolve();
3347
+
}
3348
+
for (const doc of batch) {
3349
+
try {
3350
+
if (await remove5(orama, doc, language, skipHooks)) {
3351
+
result++;
3352
+
}
3353
+
} catch (err) {
3354
+
reject(err);
3355
+
}
3356
+
}
3357
+
setTimeout(_insertMultiple, 0);
3358
+
}
3359
+
__name(_insertMultiple, "_insertMultiple");
3360
+
setTimeout(_insertMultiple, 0);
3361
+
});
3362
+
if (!skipHooks) {
3363
+
await runMultipleHook(orama.afterRemoveMultiple, orama, docIdsForHooks);
3364
+
}
3365
+
return result;
3366
+
}
3367
+
__name(removeMultiple, "removeMultiple");
3368
+
3369
+
// https:https://jsr.io/@orama/orama/2.0.6/src/constants.ts
3370
+
var MODE_FULLTEXT_SEARCH = "fulltext";
3371
+
var MODE_HYBRID_SEARCH = "hybrid";
3372
+
var MODE_VECTOR_SEARCH = "vector";
3373
+
3374
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/filters.ts
3375
+
function intersectFilteredIDs(filtered, lookedUp) {
3376
+
const map = /* @__PURE__ */ new Map();
3377
+
const result = [];
3378
+
for (const id of filtered) {
3379
+
map.set(id, true);
3380
+
}
3381
+
for (const [id, score] of lookedUp) {
3382
+
if (map.has(id)) {
3383
+
result.push([
3384
+
id,
3385
+
score
3386
+
]);
3387
+
map.delete(id);
3388
+
}
3389
+
}
3390
+
return result;
3391
+
}
3392
+
__name(intersectFilteredIDs, "intersectFilteredIDs");
3393
+
3394
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/facets.ts
3395
+
function sortingPredicate(order = "desc", a, b) {
3396
+
if (order.toLowerCase() === "asc") {
3397
+
return a[1] - b[1];
3398
+
} else {
3399
+
return b[1] - a[1];
3400
+
}
3401
+
}
3402
+
__name(sortingPredicate, "sortingPredicate");
3403
+
async function getFacets(orama, results, facetsConfig) {
3404
+
const facets = {};
3405
+
const allIDs = results.map(([id]) => id);
3406
+
const allDocs = await orama.documentsStore.getMultiple(orama.data.docs, allIDs);
3407
+
const facetKeys = Object.keys(facetsConfig);
3408
+
const properties = await orama.index.getSearchablePropertiesWithTypes(orama.data.index);
3409
+
for (const facet of facetKeys) {
3410
+
let values = {};
3411
+
if (properties[facet] === "number") {
3412
+
const { ranges } = facetsConfig[facet];
3413
+
const tmp = [];
3414
+
for (const range of ranges) {
3415
+
tmp.push([
3416
+
`${range.from}-${range.to}`,
3417
+
0
3418
+
]);
3419
+
}
3420
+
values = Object.fromEntries(tmp);
3421
+
}
3422
+
facets[facet] = {
3423
+
count: 0,
3424
+
values
3425
+
};
3426
+
}
3427
+
const allDocsLength = allDocs.length;
3428
+
for (let i = 0; i < allDocsLength; i++) {
3429
+
const doc = allDocs[i];
3430
+
for (const facet of facetKeys) {
3431
+
const facetValue = facet.includes(".") ? await getNested(doc, facet) : doc[facet];
3432
+
const propertyType = properties[facet];
3433
+
switch (propertyType) {
3434
+
case "number": {
3435
+
const ranges = facetsConfig[facet].ranges;
3436
+
calculateNumberFacet(ranges, facets[facet].values, facetValue);
3437
+
break;
3438
+
}
3439
+
case "number[]": {
3440
+
const alreadyInsertedValues = /* @__PURE__ */ new Set();
3441
+
const ranges = facetsConfig[facet].ranges;
3442
+
for (const v2 of facetValue) {
3443
+
calculateNumberFacet(ranges, facets[facet].values, v2, alreadyInsertedValues);
3444
+
}
3445
+
break;
3446
+
}
3447
+
case "boolean":
3448
+
case "enum":
3449
+
case "string": {
3450
+
calculateBooleanStringOrEnumFacet(facets[facet].values, facetValue, propertyType);
3451
+
break;
3452
+
}
3453
+
case "boolean[]":
3454
+
case "enum[]":
3455
+
case "string[]": {
3456
+
const alreadyInsertedValues = /* @__PURE__ */ new Set();
3457
+
const innerType = propertyType === "boolean[]" ? "boolean" : "string";
3458
+
for (const v2 of facetValue) {
3459
+
calculateBooleanStringOrEnumFacet(facets[facet].values, v2, innerType, alreadyInsertedValues);
3460
+
}
3461
+
break;
3462
+
}
3463
+
default:
3464
+
throw createError("FACET_NOT_SUPPORTED", propertyType);
3465
+
}
3466
+
}
3467
+
}
3468
+
for (const facet of facetKeys) {
3469
+
facets[facet].count = Object.keys(facets[facet].values).length;
3470
+
if (properties[facet] === "string") {
3471
+
const stringFacetDefinition = facetsConfig[facet];
3472
+
facets[facet].values = Object.fromEntries(Object.entries(facets[facet].values).sort((a, b) => sortingPredicate(stringFacetDefinition.sort, a, b)).slice(stringFacetDefinition.offset ?? 0, stringFacetDefinition.limit ?? 10));
3473
+
}
3474
+
}
3475
+
return facets;
3476
+
}
3477
+
__name(getFacets, "getFacets");
3478
+
function calculateNumberFacet(ranges, values, facetValue, alreadyInsertedValues) {
3479
+
for (const range of ranges) {
3480
+
const value = `${range.from}-${range.to}`;
3481
+
if (alreadyInsertedValues && alreadyInsertedValues.has(value)) {
3482
+
continue;
3483
+
}
3484
+
if (facetValue >= range.from && facetValue <= range.to) {
3485
+
if (values[value] === void 0) {
3486
+
values[value] = 1;
3487
+
} else {
3488
+
values[value]++;
3489
+
if (alreadyInsertedValues) {
3490
+
alreadyInsertedValues.add(value);
3491
+
}
3492
+
}
3493
+
}
3494
+
}
3495
+
}
3496
+
__name(calculateNumberFacet, "calculateNumberFacet");
3497
+
function calculateBooleanStringOrEnumFacet(values, facetValue, propertyType, alreadyInsertedValues) {
3498
+
const value = facetValue?.toString() ?? (propertyType === "boolean" ? "false" : "");
3499
+
if (alreadyInsertedValues && alreadyInsertedValues.has(value)) {
3500
+
return;
3501
+
}
3502
+
values[value] = (values[value] ?? 0) + 1;
3503
+
if (alreadyInsertedValues) {
3504
+
alreadyInsertedValues.add(value);
3505
+
}
3506
+
}
3507
+
__name(calculateBooleanStringOrEnumFacet, "calculateBooleanStringOrEnumFacet");
3508
+
3509
+
// https:https://jsr.io/@orama/orama/2.0.6/src/components/groups.ts
3510
+
var DEFAULT_REDUCE = {
3511
+
reducer: /* @__PURE__ */ __name((_, acc, res, index) => {
3512
+
acc[index] = res;
3513
+
return acc;
3514
+
}, "reducer"),
3515
+
getInitialValue: /* @__PURE__ */ __name((length) => Array.from({
3516
+
length
3517
+
}), "getInitialValue")
3518
+
};
3519
+
var ALLOWED_TYPES = [
3520
+
"string",
3521
+
"number",
3522
+
"boolean"
3523
+
];
3524
+
async function getGroups(orama, results, groupBy) {
3525
+
const properties = groupBy.properties;
3526
+
const propertiesLength = properties.length;
3527
+
const schemaProperties = await orama.index.getSearchablePropertiesWithTypes(orama.data.index);
3528
+
for (let i = 0; i < propertiesLength; i++) {
3529
+
const property = properties[i];
3530
+
if (typeof schemaProperties[property] === "undefined") {
3531
+
throw createError("UNKNOWN_GROUP_BY_PROPERTY", property);
3532
+
}
3533
+
if (!ALLOWED_TYPES.includes(schemaProperties[property])) {
3534
+
throw createError("INVALID_GROUP_BY_PROPERTY", property, ALLOWED_TYPES.join(", "), schemaProperties[property]);
3535
+
}
3536
+
}
3537
+
const allIDs = results.map(([id]) => getDocumentIdFromInternalId(orama.internalDocumentIDStore, id));
3538
+
const allDocs = await orama.documentsStore.getMultiple(orama.data.docs, allIDs);
3539
+
const allDocsLength = allDocs.length;
3540
+
const returnedCount = groupBy.maxResult || Number.MAX_SAFE_INTEGER;
3541
+
const listOfValues = [];
3542
+
const g = {};
3543
+
for (let i = 0; i < propertiesLength; i++) {
3544
+
const groupByKey = properties[i];
3545
+
const group = {
3546
+
property: groupByKey,
3547
+
perValue: {}
3548
+
};
3549
+
const values = /* @__PURE__ */ new Set();
3550
+
for (let j = 0; j < allDocsLength; j++) {
3551
+
const doc = allDocs[j];
3552
+
const value = await getNested(doc, groupByKey);
3553
+
if (typeof value === "undefined") {
3554
+
continue;
3555
+
}
3556
+
const keyValue = typeof value !== "boolean" ? value : "" + value;
3557
+
if (typeof group.perValue[keyValue] === "undefined") {
3558
+
group.perValue[keyValue] = {
3559
+
indexes: [],
3560
+
count: 0
3561
+
};
3562
+
}
3563
+
if (group.perValue[keyValue].count >= returnedCount) {
3564
+
continue;
3565
+
}
3566
+
group.perValue[keyValue].indexes.push(j);
3567
+
group.perValue[keyValue].count++;
3568
+
values.add(value);
3569
+
}
3570
+
listOfValues.push(Array.from(values));
3571
+
g[groupByKey] = group;
3572
+
}
3573
+
const combinations = calculateCombination(listOfValues);
3574
+
const combinationsLength = combinations.length;
3575
+
const groups = [];
3576
+
for (let i = 0; i < combinationsLength; i++) {
3577
+
const combination = combinations[i];
3578
+
const combinationLength = combination.length;
3579
+
const group = {
3580
+
values: [],
3581
+
indexes: []
3582
+
};
3583
+
const indexes = [];
3584
+
for (let j = 0; j < combinationLength; j++) {
3585
+
const value = combination[j];
3586
+
const property = properties[j];
3587
+
indexes.push(g[property].perValue[typeof value !== "boolean" ? value : "" + value].indexes);
3588
+
group.values.push(value);
3589
+
}
3590
+
group.indexes = intersect(indexes).sort((a, b) => a - b);
3591
+
if (group.indexes.length === 0) {
3592
+
continue;
3593
+
}
3594
+
groups.push(group);
3595
+
}
3596
+
const groupsLength = groups.length;
3597
+
const res = Array.from({
3598
+
length: groupsLength
3599
+
});
3600
+
for (let i = 0; i < groupsLength; i++) {
3601
+
const group = groups[i];
3602
+
const reduce = groupBy.reduce || DEFAULT_REDUCE;
3603
+
const docs = group.indexes.map((index) => {
3604
+
return {
3605
+
id: allIDs[index],
3606
+
score: results[index][1],
3607
+
document: allDocs[index]
3608
+
};
3609
+
});
3610
+
const func = reduce.reducer.bind(null, group.values);
3611
+
const initialValue = reduce.getInitialValue(group.indexes.length);
3612
+
const aggregationValue = docs.reduce(func, initialValue);
3613
+
res[i] = {
3614
+
values: group.values,
3615
+
result: aggregationValue
3616
+
};
3617
+
}
3618
+
return res;
3619
+
}
3620
+
__name(getGroups, "getGroups");
3621
+
function calculateCombination(arrs, index = 0) {
3622
+
if (index + 1 === arrs.length) return arrs[index].map((item) => [
3623
+
item
3624
+
]);
3625
+
const head = arrs[index];
3626
+
const c2 = calculateCombination(arrs, index + 1);
3627
+
const combinations = [];
3628
+
for (const value of head) {
3629
+
for (const combination of c2) {
3630
+
const result = [
3631
+
value
3632
+
];
3633
+
safeArrayPush(result, combination);
3634
+
combinations.push(result);
3635
+
}
3636
+
}
3637
+
return combinations;
3638
+
}
3639
+
__name(calculateCombination, "calculateCombination");
3640
+
3641
+
// https:https://jsr.io/@orama/orama/2.0.6/src/methods/search-fulltext.ts
3642
+
async function fullTextSearch(orama, params, language) {
3643
+
const timeStart = await getNanosecondsTime();
3644
+
if (orama.beforeSearch) {
3645
+
await runBeforeSearch(orama.beforeSearch, orama, params, language);
3646
+
}
3647
+
params.relevance = Object.assign(params.relevance ?? {}, defaultBM25Params);
3648
+
const vectorProperties = Object.keys(orama.data.index.vectorIndexes);
3649
+
const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0;
3650
+
const { limit = 10, offset = 0, term, properties, threshold = 1, distinctOn, includeVectors = false } = params;
3651
+
const isPreflight = params.preflight === true;
3652
+
const { index, docs } = orama.data;
3653
+
const tokens = await orama.tokenizer.tokenize(term ?? "", language);
3654
+
let propertiesToSearch = orama.caches["propertiesToSearch"];
3655
+
if (!propertiesToSearch) {
3656
+
const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);
3657
+
propertiesToSearch = await orama.index.getSearchableProperties(index);
3658
+
propertiesToSearch = propertiesToSearch.filter((prop) => propertiesToSearchWithTypes[prop].startsWith("string"));
3659
+
orama.caches["propertiesToSearch"] = propertiesToSearch;
3660
+
}
3661
+
if (properties && properties !== "*") {
3662
+
for (const prop of properties) {
3663
+
if (!propertiesToSearch.includes(prop)) {
3664
+
throw createError("UNKNOWN_INDEX", prop, propertiesToSearch.join(", "));
3665
+
}
3666
+
}
3667
+
propertiesToSearch = propertiesToSearch.filter((prop) => properties.includes(prop));
3668
+
}
3669
+
const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(docs), timeStart);
3670
+
const hasFilters = Object.keys(params.where ?? {}).length > 0;
3671
+
let whereFiltersIDs = [];
3672
+
if (hasFilters) {
3673
+
whereFiltersIDs = await orama.index.searchByWhereClause(context, index, params.where);
3674
+
}
3675
+
const tokensLength = tokens.length;
3676
+
if (tokensLength || properties && properties.length > 0) {
3677
+
const indexesLength = propertiesToSearch.length;
3678
+
for (let i = 0; i < indexesLength; i++) {
3679
+
const prop = propertiesToSearch[i];
3680
+
if (tokensLength !== 0) {
3681
+
for (let j = 0; j < tokensLength; j++) {
3682
+
const term2 = tokens[j];
3683
+
const scoreList = await orama.index.search(context, index, prop, term2);
3684
+
safeArrayPush(context.indexMap[prop][term2], scoreList);
3685
+
}
3686
+
} else {
3687
+
context.indexMap[prop][""] = [];
3688
+
const scoreList = await orama.index.search(context, index, prop, "");
3689
+
safeArrayPush(context.indexMap[prop][""], scoreList);
3690
+
}
3691
+
const docIds = context.indexMap[prop];
3692
+
const vals = Object.values(docIds);
3693
+
context.docsIntersection[prop] = prioritizeTokenScores(vals, params?.boost?.[prop] ?? 1, threshold, tokensLength);
3694
+
const uniqueDocs = context.docsIntersection[prop];
3695
+
const uniqueDocsLength = uniqueDocs.length;
3696
+
for (let i2 = 0; i2 < uniqueDocsLength; i2++) {
3697
+
const [id, score] = uniqueDocs[i2];
3698
+
const prevScore = context.uniqueDocsIDs[id];
3699
+
if (prevScore) {
3700
+
context.uniqueDocsIDs[id] = prevScore + score + 0.5;
3701
+
} else {
3702
+
context.uniqueDocsIDs[id] = score;
3703
+
}
3704
+
}
3705
+
}
3706
+
} else if (tokens.length === 0 && term) {
3707
+
context.uniqueDocsIDs = {};
3708
+
} else {
3709
+
context.uniqueDocsIDs = Object.fromEntries(Object.keys(await orama.documentsStore.getAll(orama.data.docs)).map((k) => [
3710
+
k,
3711
+
0
3712
+
]));
3713
+
}
3714
+
let uniqueDocsArray = Object.entries(context.uniqueDocsIDs).map(([id, score]) => [
3715
+
+id,
3716
+
score
3717
+
]);
3718
+
if (hasFilters) {
3719
+
uniqueDocsArray = intersectFilteredIDs(whereFiltersIDs, uniqueDocsArray);
3720
+
}
3721
+
if (params.sortBy) {
3722
+
if (typeof params.sortBy === "function") {
3723
+
const ids = uniqueDocsArray.map(([id]) => id);
3724
+
const docs2 = await orama.documentsStore.getMultiple(orama.data.docs, ids);
3725
+
const docsWithIdAndScore = docs2.map((d, i) => [
3726
+
uniqueDocsArray[i][0],
3727
+
uniqueDocsArray[i][1],
3728
+
d
3729
+
]);
3730
+
docsWithIdAndScore.sort(params.sortBy);
3731
+
uniqueDocsArray = docsWithIdAndScore.map(([id, score]) => [
3732
+
id,
3733
+
score
3734
+
]);
3735
+
} else {
3736
+
uniqueDocsArray = await orama.sorter.sortBy(orama.data.sorting, uniqueDocsArray, params.sortBy).then((results2) => results2.map(([id, score]) => [
3737
+
getInternalDocumentId(orama.internalDocumentIDStore, id),
3738
+
score
3739
+
]));
3740
+
}
3741
+
} else {
3742
+
uniqueDocsArray = uniqueDocsArray.sort(sortTokenScorePredicate);
3743
+
}
3744
+
let results;
3745
+
if (!isPreflight && distinctOn) {
3746
+
results = await fetchDocumentsWithDistinct(orama, uniqueDocsArray, offset, limit, distinctOn);
3747
+
} else if (!isPreflight) {
3748
+
results = await fetchDocuments(orama, uniqueDocsArray, offset, limit);
3749
+
}
3750
+
const searchResult = {
3751
+
elapsed: {
3752
+
formatted: "",
3753
+
raw: 0
3754
+
},
3755
+
// We keep the hits array empty if it's a preflight request.
3756
+
hits: [],
3757
+
count: uniqueDocsArray.length
3758
+
};
3759
+
if (typeof results !== "undefined") {
3760
+
searchResult.hits = results.filter(Boolean);
3761
+
if (!includeVectors) {
3762
+
removeVectorsFromHits(searchResult, vectorProperties);
3763
+
}
3764
+
}
3765
+
if (shouldCalculateFacets) {
3766
+
const facets = await getFacets(orama, uniqueDocsArray, params.facets);
3767
+
searchResult.facets = facets;
3768
+
}
3769
+
if (params.groupBy) {
3770
+
searchResult.groups = await getGroups(orama, uniqueDocsArray, params.groupBy);
3771
+
}
3772
+
if (orama.afterSearch) {
3773
+
await runAfterSearch(orama.afterSearch, orama, params, language, searchResult);
3774
+
}
3775
+
searchResult.elapsed = await orama.formatElapsedTime(await getNanosecondsTime() - context.timeStart);
3776
+
return searchResult;
3777
+
}
3778
+
__name(fullTextSearch, "fullTextSearch");
3779
+
3780
+
// https:https://jsr.io/@orama/orama/2.0.6/src/methods/search-vector.ts
3781
+
async function searchVector(orama, params, language = "english") {
3782
+
const timeStart = await getNanosecondsTime();
3783
+
if (orama.beforeSearch) {
3784
+
await runBeforeSearch(orama.beforeSearch, orama, params, language);
3785
+
}
3786
+
const { vector } = params;
3787
+
if (vector && (!("value" in vector) || !("property" in vector))) {
3788
+
throw createError("INVALID_VECTOR_INPUT", Object.keys(vector).join(", "));
3789
+
}
3790
+
const { limit = 10, offset = 0, includeVectors = false } = params;
3791
+
const vectorIndex = orama.data.index.vectorIndexes[vector.property];
3792
+
const vectorSize = vectorIndex.size;
3793
+
const vectors = vectorIndex.vectors;
3794
+
const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0;
3795
+
const hasFilters = Object.keys(params.where ?? {}).length > 0;
3796
+
const { index, docs: oramaDocs } = orama.data;
3797
+
if (vector?.value.length !== vectorSize) {
3798
+
throw createError("INVALID_INPUT_VECTOR", vector?.property, vectorSize, vector?.value.length);
3799
+
}
3800
+
if (!(vector instanceof Float32Array)) {
3801
+
vector.value = new Float32Array(vector.value);
3802
+
}
3803
+
let results = findSimilarVectors(vector.value, vectors, vectorSize, params.similarity).map(([id, score]) => [
3804
+
getInternalDocumentId(orama.internalDocumentIDStore, id),
3805
+
score
3806
+
]);
3807
+
let propertiesToSearch = orama.caches["propertiesToSearch"];
3808
+
if (!propertiesToSearch) {
3809
+
const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);
3810
+
propertiesToSearch = await orama.index.getSearchableProperties(index);
3811
+
propertiesToSearch = propertiesToSearch.filter((prop) => propertiesToSearchWithTypes[prop].startsWith("string"));
3812
+
orama.caches["propertiesToSearch"] = propertiesToSearch;
3813
+
}
3814
+
const tokens = [];
3815
+
const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(oramaDocs), timeStart);
3816
+
let whereFiltersIDs = [];
3817
+
if (hasFilters) {
3818
+
whereFiltersIDs = await orama.index.searchByWhereClause(context, index, params.where);
3819
+
results = intersectFilteredIDs(whereFiltersIDs, results);
3820
+
}
3821
+
let facetsResults = [];
3822
+
if (shouldCalculateFacets) {
3823
+
const facets = await getFacets(orama, results, params.facets);
3824
+
facetsResults = facets;
3825
+
}
3826
+
const docs = Array.from({
3827
+
length: limit
3828
+
});
3829
+
for (let i = 0; i < limit; i++) {
3830
+
const result = results[i + offset];
3831
+
if (!result) {
3832
+
break;
3833
+
}
3834
+
const doc = orama.data.docs.docs[result[0]];
3835
+
if (doc) {
3836
+
if (!includeVectors) {
3837
+
doc[vector.property] = null;
3838
+
}
3839
+
const newDoc = {
3840
+
id: getDocumentIdFromInternalId(orama.internalDocumentIDStore, result[0]),
3841
+
score: result[1],
3842
+
document: doc
3843
+
};
3844
+
docs[i] = newDoc;
3845
+
}
3846
+
}
3847
+
let groups = [];
3848
+
if (params.groupBy) {
3849
+
groups = await getGroups(orama, results, params.groupBy);
3850
+
}
3851
+
if (orama.afterSearch) {
3852
+
await runAfterSearch(orama.afterSearch, orama, params, language, results);
3853
+
}
3854
+
const timeEnd = await getNanosecondsTime();
3855
+
const elapsedTime = timeEnd - timeStart;
3856
+
return {
3857
+
count: results.length,
3858
+
hits: docs.filter(Boolean),
3859
+
elapsed: {
3860
+
raw: Number(elapsedTime),
3861
+
formatted: await formatNanoseconds(elapsedTime)
3862
+
},
3863
+
...facetsResults ? {
3864
+
facets: facetsResults
3865
+
} : {},
3866
+
...groups ? {
3867
+
groups
3868
+
} : {}
3869
+
};
3870
+
}
3871
+
__name(searchVector, "searchVector");
3872
+
3873
+
// https:https://jsr.io/@orama/orama/2.0.6/src/methods/search-hybrid.ts
3874
+
async function hybridSearch(orama, params, language) {
3875
+
const timeStart = await getNanosecondsTime();
3876
+
if (orama.beforeSearch) {
3877
+
await runBeforeSearch(orama.beforeSearch, orama, params, language);
3878
+
}
3879
+
const { offset = 0, limit = 10, includeVectors = false } = params;
3880
+
const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0;
3881
+
const [fullTextIDs, vectorIDs] = await Promise.all([
3882
+
getFullTextSearchIDs(orama, params, language),
3883
+
getVectorSearchIDs(orama, params)
3884
+
]);
3885
+
const { index, docs } = orama.data;
3886
+
const hybridWeights = params.hybridWeights;
3887
+
let uniqueTokenScores = mergeAndRankResults(fullTextIDs, vectorIDs, params.term ?? "", hybridWeights);
3888
+
const tokens = await orama.tokenizer.tokenize(params.term ?? "", language);
3889
+
let propertiesToSearch = orama.caches["propertiesToSearch"];
3890
+
if (!propertiesToSearch) {
3891
+
const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);
3892
+
propertiesToSearch = await orama.index.getSearchableProperties(index);
3893
+
propertiesToSearch = propertiesToSearch.filter((prop) => propertiesToSearchWithTypes[prop].startsWith("string"));
3894
+
orama.caches["propertiesToSearch"] = propertiesToSearch;
3895
+
}
3896
+
if (params.properties && params.properties !== "*") {
3897
+
for (const prop of params.properties) {
3898
+
if (!propertiesToSearch.includes(prop)) {
3899
+
throw createError("UNKNOWN_INDEX", prop, propertiesToSearch.join(", "));
3900
+
}
3901
+
}
3902
+
propertiesToSearch = propertiesToSearch.filter((prop) => params.properties.includes(prop));
3903
+
}
3904
+
const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(docs), timeStart);
3905
+
const hasFilters = Object.keys(params.where ?? {}).length > 0;
3906
+
let whereFiltersIDs = [];
3907
+
if (hasFilters) {
3908
+
whereFiltersIDs = await orama.index.searchByWhereClause(context, index, params.where);
3909
+
uniqueTokenScores = intersectFilteredIDs(whereFiltersIDs, uniqueTokenScores).slice(offset, offset + limit);
3910
+
}
3911
+
let facetsResults;
3912
+
if (shouldCalculateFacets) {
3913
+
const facets = await getFacets(orama, uniqueTokenScores, params.facets);
3914
+
facetsResults = facets;
3915
+
}
3916
+
let groups;
3917
+
if (params.groupBy) {
3918
+
groups = await getGroups(orama, uniqueTokenScores, params.groupBy);
3919
+
}
3920
+
const results = (await fetchDocuments(orama, uniqueTokenScores, offset, limit)).filter(Boolean);
3921
+
if (orama.afterSearch) {
3922
+
await runAfterSearch(orama.afterSearch, orama, params, language, results);
3923
+
}
3924
+
const timeEnd = await getNanosecondsTime();
3925
+
const returningResults = {
3926
+
count: uniqueTokenScores.length,
3927
+
elapsed: {
3928
+
raw: Number(timeEnd - timeStart),
3929
+
formatted: await formatNanoseconds(timeEnd - timeStart)
3930
+
},
3931
+
hits: results,
3932
+
...facetsResults ? {
3933
+
facets: facetsResults
3934
+
} : {},
3935
+
...groups ? {
3936
+
groups
3937
+
} : {}
3938
+
};
3939
+
if (!includeVectors) {
3940
+
const vectorProperties = Object.keys(orama.data.index.vectorIndexes);
3941
+
removeVectorsFromHits(returningResults, vectorProperties);
3942
+
}
3943
+
return returningResults;
3944
+
}
3945
+
__name(hybridSearch, "hybridSearch");
3946
+
async function getFullTextSearchIDs(orama, params, language) {
3947
+
const timeStart = await getNanosecondsTime();
3948
+
params.relevance = Object.assign(params.relevance ?? {}, defaultBM25Params);
3949
+
const { term, properties, threshold = 1 } = params;
3950
+
const { index, docs } = orama.data;
3951
+
const tokens = await orama.tokenizer.tokenize(term ?? "", language);
3952
+
let propertiesToSearch = orama.caches["propertiesToSearch"];
3953
+
if (!propertiesToSearch) {
3954
+
const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);
3955
+
propertiesToSearch = await orama.index.getSearchableProperties(index);
3956
+
propertiesToSearch = propertiesToSearch.filter((prop) => propertiesToSearchWithTypes[prop].startsWith("string"));
3957
+
orama.caches["propertiesToSearch"] = propertiesToSearch;
3958
+
}
3959
+
if (properties && properties !== "*") {
3960
+
for (const prop of properties) {
3961
+
if (!propertiesToSearch.includes(prop)) {
3962
+
throw createError("UNKNOWN_INDEX", prop, propertiesToSearch.join(", "));
3963
+
}
3964
+
}
3965
+
propertiesToSearch = propertiesToSearch.filter((prop) => properties.includes(prop));
3966
+
}
3967
+
const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(docs), timeStart);
3968
+
const tokensLength = tokens.length;
3969
+
if (tokensLength || properties && properties.length > 0) {
3970
+
const indexesLength = propertiesToSearch.length;
3971
+
for (let i = 0; i < indexesLength; i++) {
3972
+
const prop = propertiesToSearch[i];
3973
+
if (tokensLength !== 0) {
3974
+
for (let j = 0; j < tokensLength; j++) {
3975
+
const term2 = tokens[j];
3976
+
const scoreList = await orama.index.search(context, index, prop, term2);
3977
+
safeArrayPush(context.indexMap[prop][term2], scoreList);
3978
+
}
3979
+
} else {
3980
+
context.indexMap[prop][""] = [];
3981
+
const scoreList = await orama.index.search(context, index, prop, "");
3982
+
safeArrayPush(context.indexMap[prop][""], scoreList);
3983
+
}
3984
+
const docIds = context.indexMap[prop];
3985
+
const vals = Object.values(docIds);
3986
+
context.docsIntersection[prop] = prioritizeTokenScores(vals, params?.boost?.[prop] ?? 1, threshold, tokensLength);
3987
+
const uniqueDocs = context.docsIntersection[prop];
3988
+
const uniqueDocsLength = uniqueDocs.length;
3989
+
for (let i2 = 0; i2 < uniqueDocsLength; i2++) {
3990
+
const [id, score] = uniqueDocs[i2];
3991
+
const prevScore = context.uniqueDocsIDs[id];
3992
+
if (prevScore) {
3993
+
context.uniqueDocsIDs[id] = prevScore + score + 0.5;
3994
+
} else {
3995
+
context.uniqueDocsIDs[id] = score;
3996
+
}
3997
+
}
3998
+
}
3999
+
} else if (tokens.length === 0 && term) {
4000
+
context.uniqueDocsIDs = {};
4001
+
} else {
4002
+
context.uniqueDocsIDs = Object.fromEntries(Object.keys(await orama.documentsStore.getAll(orama.data.docs)).map((k) => [
4003
+
k,
4004
+
0
4005
+
]));
4006
+
}
4007
+
const uniqueIDs = Object.entries(context.uniqueDocsIDs).map(([id, score]) => [
4008
+
+id,
4009
+
score
4010
+
]).sort((a, b) => b[1] - a[1]);
4011
+
return minMaxScoreNormalization(uniqueIDs);
4012
+
}
4013
+
__name(getFullTextSearchIDs, "getFullTextSearchIDs");
4014
+
async function getVectorSearchIDs(orama, params) {
4015
+
const vector = params.vector;
4016
+
const vectorIndex = orama.data.index.vectorIndexes[vector?.property];
4017
+
const vectorSize = vectorIndex.size;
4018
+
const vectors = vectorIndex.vectors;
4019
+
if (vector && (!vector.value || !vector.property)) {
4020
+
throw createError("INVALID_VECTOR_INPUT", Object.keys(vector).join(", "));
4021
+
}
4022
+
if (vector.value.length !== vectorSize) {
4023
+
throw createError("INVALID_INPUT_VECTOR", vector.property, vectorSize, vector.value.length);
4024
+
}
4025
+
if (!(vector instanceof Float32Array)) {
4026
+
vector.value = new Float32Array(vector.value);
4027
+
}
4028
+
const uniqueIDs = findSimilarVectors(vector.value, vectors, vectorSize, params.similarity).map(([id, score]) => [
4029
+
getInternalDocumentId(orama.internalDocumentIDStore, id),
4030
+
score
4031
+
]);
4032
+
return minMaxScoreNormalization(uniqueIDs);
4033
+
}
4034
+
__name(getVectorSearchIDs, "getVectorSearchIDs");
4035
+
function minMaxScoreNormalization(results) {
4036
+
const maxScore = Math.max(...results.map(([, score]) => score));
4037
+
return results.map(([id, score]) => [
4038
+
id,
4039
+
score / maxScore
4040
+
]);
4041
+
}
4042
+
__name(minMaxScoreNormalization, "minMaxScoreNormalization");
4043
+
function normalizeScore(score, maxScore) {
4044
+
return score / maxScore;
4045
+
}
4046
+
__name(normalizeScore, "normalizeScore");
4047
+
function hybridScore(textScore, vectorScore, textWeight, vectorWeight) {
4048
+
return textScore * textWeight + vectorScore * vectorWeight;
4049
+
}
4050
+
__name(hybridScore, "hybridScore");
4051
+
function mergeAndRankResults(textResults, vectorResults, query, hybridWeights) {
4052
+
const maxTextScore = Math.max(...textResults.map(([, score]) => score));
4053
+
const maxVectorScore = Math.max(...vectorResults.map(([, score]) => score));
4054
+
const hasHybridWeights = hybridWeights && hybridWeights.text && hybridWeights.vector;
4055
+
const { text: textWeight, vector: vectorWeight } = hasHybridWeights ? hybridWeights : getQueryWeights(query);
4056
+
const mergedResults = /* @__PURE__ */ new Map();
4057
+
const textResultsLength = textResults.length;
4058
+
for (let i = 0; i < textResultsLength; i++) {
4059
+
const normalizedScore = normalizeScore(textResults[i][1], maxTextScore);
4060
+
const hybridScoreValue = hybridScore(normalizedScore, 0, textWeight, vectorWeight);
4061
+
mergedResults.set(textResults[i][0], hybridScoreValue);
4062
+
}
4063
+
const vectorResultsLength = vectorResults.length;
4064
+
for (let i = 0; i < vectorResultsLength; i++) {
4065
+
const normalizedScore = normalizeScore(vectorResults[i][1], maxVectorScore);
4066
+
if (mergedResults.has(vectorResults[i][0])) {
4067
+
let existingRes = mergedResults.get(vectorResults[i][0]);
4068
+
mergedResults.set(vectorResults[i][0], existingRes += hybridScore(0, normalizedScore, textWeight, vectorWeight));
4069
+
} else {
4070
+
mergedResults.set(vectorResults[i][0], hybridScore(0, normalizedScore, textWeight, vectorWeight));
4071
+
}
4072
+
}
4073
+
return [
4074
+
...mergedResults
4075
+
].sort((a, b) => b[1] - a[1]);
4076
+
}
4077
+
__name(mergeAndRankResults, "mergeAndRankResults");
4078
+
function getQueryWeights(query) {
4079
+
return {
4080
+
text: 0.5,
4081
+
vector: 0.5
4082
+
};
4083
+
}
4084
+
__name(getQueryWeights, "getQueryWeights");
4085
+
4086
+
// https:https://jsr.io/@orama/orama/2.0.6/src/methods/search.ts
4087
+
var defaultBM25Params = {
4088
+
k: 1.2,
4089
+
b: 0.75,
4090
+
d: 0.5
4091
+
};
4092
+
async function createSearchContext(tokenizer, index, documentsStore, language, params, properties, tokens, docsCount, timeStart) {
4093
+
const indexMap = {};
4094
+
const docsIntersection = {};
4095
+
for (const prop of properties) {
4096
+
const tokensMap = {};
4097
+
for (const token of tokens) {
4098
+
tokensMap[token] = [];
4099
+
}
4100
+
indexMap[prop] = tokensMap;
4101
+
docsIntersection[prop] = [];
4102
+
}
4103
+
return {
4104
+
timeStart,
4105
+
tokenizer,
4106
+
index,
4107
+
documentsStore,
4108
+
language,
4109
+
params,
4110
+
docsCount,
4111
+
uniqueDocsIDs: {},
4112
+
indexMap,
4113
+
docsIntersection
4114
+
};
4115
+
}
4116
+
__name(createSearchContext, "createSearchContext");
4117
+
async function search2(orama, params, language) {
4118
+
const mode = params.mode ?? MODE_FULLTEXT_SEARCH;
4119
+
if (mode === MODE_FULLTEXT_SEARCH) {
4120
+
return fullTextSearch(orama, params, language);
4121
+
}
4122
+
if (mode === MODE_VECTOR_SEARCH) {
4123
+
return searchVector(orama, params);
4124
+
}
4125
+
if (mode === MODE_HYBRID_SEARCH) {
4126
+
return hybridSearch(orama, params);
4127
+
}
4128
+
throw createError("INVALID_SEARCH_MODE", mode);
4129
+
}
4130
+
__name(search2, "search");
4131
+
async function fetchDocumentsWithDistinct(orama, uniqueDocsArray, offset, limit, distinctOn) {
4132
+
const docs = orama.data.docs;
4133
+
const values = /* @__PURE__ */ new Map();
4134
+
const results = [];
4135
+
const resultIDs = /* @__PURE__ */ new Set();
4136
+
const uniqueDocsArrayLength = uniqueDocsArray.length;
4137
+
let count3 = 0;
4138
+
for (let i = 0; i < uniqueDocsArrayLength; i++) {
4139
+
const idAndScore = uniqueDocsArray[i];
4140
+
if (typeof idAndScore === "undefined") {
4141
+
continue;
4142
+
}
4143
+
const [id, score] = idAndScore;
4144
+
if (resultIDs.has(id)) {
4145
+
continue;
4146
+
}
4147
+
const doc = await orama.documentsStore.get(docs, id);
4148
+
const value = await getNested(doc, distinctOn);
4149
+
if (typeof value === "undefined" || values.has(value)) {
4150
+
continue;
4151
+
}
4152
+
values.set(value, true);
4153
+
count3++;
4154
+
if (count3 <= offset) {
4155
+
continue;
4156
+
}
4157
+
results.push({
4158
+
id: getDocumentIdFromInternalId(orama.internalDocumentIDStore, id),
4159
+
score,
4160
+
document: doc
4161
+
});
4162
+
resultIDs.add(id);
4163
+
if (count3 >= offset + limit) {
4164
+
break;
4165
+
}
4166
+
}
4167
+
return results;
4168
+
}
4169
+
__name(fetchDocumentsWithDistinct, "fetchDocumentsWithDistinct");
4170
+
async function fetchDocuments(orama, uniqueDocsArray, offset, limit) {
4171
+
const docs = orama.data.docs;
4172
+
const results = Array.from({
4173
+
length: limit
4174
+
});
4175
+
const resultIDs = /* @__PURE__ */ new Set();
4176
+
for (let i = offset; i < limit + offset; i++) {
4177
+
const idAndScore = uniqueDocsArray[i];
4178
+
if (typeof idAndScore === "undefined") {
4179
+
break;
4180
+
}
4181
+
const [id, score] = idAndScore;
4182
+
if (!resultIDs.has(id)) {
4183
+
const fullDoc = await orama.documentsStore.get(docs, id);
4184
+
results[i] = {
4185
+
id: getDocumentIdFromInternalId(orama.internalDocumentIDStore, id),
4186
+
score,
4187
+
document: fullDoc
4188
+
};
4189
+
resultIDs.add(id);
4190
+
}
4191
+
}
4192
+
return results;
4193
+
}
4194
+
__name(fetchDocuments, "fetchDocuments");
4195
+
4196
+
// components/processor/search/worker.js
4197
+
var cacheId = signal(
4198
+
/** @type {string} */
4199
+
""
4200
+
);
4201
+
var inserted = signal(
4202
+
/** @type {Set<string>} */
4203
+
/* @__PURE__ */ new Set()
4204
+
);
4205
+
var PLUGINS = [];
4206
+
var db = create8({
4207
+
schema: SCHEMA,
4208
+
plugins: PLUGINS
4209
+
// components: {
4210
+
// TODO:
4211
+
// https://docs.orama.com/open-source/usage/insert#remote-document-storing
4212
+
// documentStore: { ... }
4213
+
// },
4214
+
});
4215
+
async function search3(term) {
4216
+
term = term.trim();
4217
+
return await _search(term, []);
4218
+
}
4219
+
__name(search3, "search");
4220
+
async function supply(tracks) {
4221
+
const ids = [];
4222
+
const tracksMap = {};
4223
+
tracks.forEach((track) => {
4224
+
ids.push(track.id);
4225
+
tracksMap[track.id] = track;
4226
+
});
4227
+
const currentSet = inserted.value;
4228
+
const newSet = new Set(ids);
4229
+
const removedIds = currentSet.difference(newSet);
4230
+
const newIds = newSet.difference(currentSet);
4231
+
const newTracks = Array.from(newIds).map((id) => tracksMap[id]);
4232
+
await removeMultiple(await db, Array.from(removedIds));
4233
+
await insertMultiple(await db, newTracks);
4234
+
inserted.value = newSet;
4235
+
cacheId.value = xxh32(ids.sort().join("")).toString();
4236
+
}
4237
+
__name(supply, "supply");
4238
+
ostiary((port) => {
4239
+
define("search", search3, port);
4240
+
define("supply", supply, port);
4241
+
});
4242
+
async function _search(term, tracks) {
4243
+
console.log("Search with offset:", tracks.length);
4244
+
const results = await search2(await db, {
4245
+
// mode: "hybrid",
4246
+
term,
4247
+
limit: 1e4,
4248
+
offset: tracks.length
4249
+
});
4250
+
const allTracks = tracks.concat(
4251
+
results.hits.map((hit) => (
4252
+
/** @type {Track} */
4253
+
/** @type {unknown} */
4254
+
hit.document
4255
+
))
4256
+
);
4257
+
if (allTracks.length < results.count) {
4258
+
return await _search(term, allTracks);
4259
+
} else {
4260
+
return allTracks;
4261
+
}
4262
+
}
4263
+
__name(_search, "_search");
4264
+
export {
4265
+
cacheId,
4266
+
inserted,
4267
+
search3 as search,
4268
+
supply
4269
+
};
4270
+
4271
+
//# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/worker.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/processor/search/worker.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/processor/search/worker.js.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/transformer/output/string/json/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/transformer/output/string/json/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../../../chunk-7KGRAMQL.js";
6
+
import "../../../../../chunk-GULCWZMN.js";
7
+
import "../../../../../chunk-SR6AOZ6U.js";
8
+
import "../../../../../chunk-LGHY5MKC.js";
9
+
import "../../../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/transformer/output/string/json/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/components/transformer/output/string/json/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/components/transformer/output/string/json/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/definitions/index.ts
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/definitions/index.ts
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/definitions/index.ts
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/definitions/output/tracks.json
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/definitions/output/tracks.json
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/definitions/output/tracks.json
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/favicon-16x16.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/favicon-16x16.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/favicon-16x16.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/favicon-32x32.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/favicon-32x32.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/favicon-32x32.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/favicon.ico
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/favicon.ico
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/favicon.ico
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/InterVariable-Italic.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/InterVariable-Italic.woff2
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/fonts/InterVariable-Italic.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/InterVariable.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/InterVariable.woff2
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/fonts/InterVariable.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/ms_sans_serif.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/ms_sans_serif.woff2
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/fonts/ms_sans_serif.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/ms_sans_serif_bold.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/fonts/ms_sans_serif_bold.woff2
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/fonts/ms_sans_serif_bold.woff2
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/1.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/1.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/1.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/10.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/10.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/10.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/11.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/11.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/11.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/12.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/12.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/12.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/13.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/13.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/13.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/14.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/14.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/14.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/15.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/15.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/15.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/16.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/16.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/16.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/17.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/17.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/17.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/18.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/18.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/18.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/19.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/19.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/19.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/2.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/2.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/2.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/20.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/20.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/20.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/21.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/21.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/21.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/22.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/22.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/22.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/23.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/23.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/23.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/24.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/24.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/24.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/25.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/25.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/25.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/26.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/26.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/26.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/27.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/27.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/27.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/28.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/28.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/28.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/29.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/29.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/29.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/3.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/3.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/3.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/30.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/30.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/30.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/4.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/4.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/4.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/5.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/5.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/5.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/6.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/6.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/6.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/7.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/7.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/7.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/8.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/8.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/8.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/9.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/9.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/9.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/1.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/1.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/1.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/10.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/10.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/10.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/11.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/11.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/11.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/12.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/12.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/12.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/13.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/13.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/13.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/14.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/14.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/14.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/15.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/15.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/15.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/16.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/16.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/16.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/17.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/17.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/17.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/18.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/18.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/18.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/19.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/19.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/19.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/2.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/2.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/2.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/20.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/20.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/20.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/21.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/21.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/21.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/22.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/22.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/22.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/23.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/23.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/23.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/24.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/24.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/24.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/25.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/25.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/25.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/26.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/26.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/26.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/27.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/27.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/27.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/28.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/28.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/28.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/29.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/29.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/29.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/3.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/3.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/3.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/30.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/30.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/30.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/4.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/4.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/4.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/5.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/5.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/5.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/6.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/6.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/6.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/7.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/7.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/7.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/8.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/8.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/8.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/9.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/background/thumbnails/9.jpg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/background/thumbnails/9.jpg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-current.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-current.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/diffuse-current.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-dark.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-dark.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/diffuse-dark.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-grey.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-grey.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/diffuse-grey.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-light.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse-light.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/diffuse-light.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse__icon-dark.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse__icon-dark.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/diffuse__icon-dark.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse__icon-grey.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse__icon-grey.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/diffuse__icon-grey.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse__icon-light.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/diffuse__icon-light.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/diffuse__icon-light.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icon-square-ws.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icon-square-ws.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icon-square-ws.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icon-square.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icon-square.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icon-square.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icon.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icon.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icon.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/catalog-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/catalog-1.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/catalog-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/cd_audio_cd_a-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-2.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/cd_audio_cd_a-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/cd_audio_cd_a-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_audio_cd_a-4.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/cd_audio_cd_a-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_drive_purple-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/cd_drive_purple-5.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/cd_drive_purple-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/channels-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/channels-2.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/channels-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/check-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/check-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/check-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/computer_sound-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/computer_sound-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/computer_sound-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/computer_user_pencil-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/computer_user_pencil-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/computer_user_pencil-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/connected_world-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/connected_world-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/connected_world-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_admin_tools-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_admin_tools-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_admin_tools-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_admin_tools-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_admin_tools-5.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_admin_tools-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_channels-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_channels-2.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_channels-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_channels-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_channels-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_channels-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_closed-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_closed-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_closed-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_closed-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_closed-4.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_closed-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_control_panel-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_control_panel-2.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_control_panel-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_control_panel-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_control_panel-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_control_panel-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_explorer-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_explorer-4.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_explorer-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_explorer-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_explorer-5.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_explorer-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_favorites-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_favorites-2.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_favorites-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_favorites-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_favorites-4.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_favorites-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_net_web-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_net_web-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_net_web-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_net_web-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_net_web-4.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_net_web-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_network_conn-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_network_conn-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_network_conn-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_network_conn-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_network_conn-5.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_network_conn-5.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/gears-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/gears-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/gears-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/globe_map-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/globe_map-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/globe_map-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/help_book_big-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/help_book_big-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/help_book_big-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/installer-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/installer-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/installer-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/installer_generic_old-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/installer_generic_old-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/installer_generic_old-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/loudspeaker_wave-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/loudspeaker_wave-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/loudspeaker_wave-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/magnifying_glass-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/magnifying_glass-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/magnifying_glass-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/magnifying_glass_4-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/magnifying_glass_4-1.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/magnifying_glass_4-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/media_player-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/media_player-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/media_player-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/media_player_stream_no.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/media_player_stream_no.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/media_player_stream_no.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/ms_dos-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/ms_dos-1.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/ms_dos-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_error-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_error-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/msg_error-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_information-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_information-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/msg_information-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_question-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_question-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/msg_question-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_warning-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/msg_warning-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/msg_warning-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/network_drive_world-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/network_drive_world-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/network_drive_world-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/no-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/no-1.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/no-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/restrict-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/restrict-1.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/restrict-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/search_computer-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/search_computer-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/search_computer-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/search_server-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/search_server-1.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/search_server-1.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/search_web-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/search_web-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/search_web-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/settings_gear-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/settings_gear-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/settings_gear-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/settings_gear-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/settings_gear-2.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/settings_gear-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/tip.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/tip.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/tip.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/utopia_smiley.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/utopia_smiley.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/utopia_smiley.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/winamp2-32x32.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/winamp2-32x32.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/winamp2-32x32.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/windows-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/windows-0.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/windows-0.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/world-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/world-2.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/world-2.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/world-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/world-4.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/world-4.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/world_network_directories-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/images/icons/windows_98/world_network_directories-3.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/images/icons/windows_98/world_network_directories-3.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/index.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/index.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/index.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/index.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/index.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/index.css.map
+352
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/index.html
+352
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/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
+
<!--<meta name="media-controllable" />
7
+
<meta name="apple-mobile-web-app-capable" content="yes" />-->
8
+
9
+
<title>Diffuse</title>
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
+
<style>
22
+
@import "./styles/reset.css";
23
+
@import "./styles/fonts.css";
24
+
@import "./styles/variables.css";
25
+
</style>
26
+
</head>
27
+
<body>
28
+
<link rel="stylesheet" href="index.css" />
29
+
30
+
<header>
31
+
<h1>
32
+
<svg viewBox="0 0 902 134" width="160">
33
+
<title>Diffuse</title>
34
+
<use
35
+
xlink:href="images/diffuse-current.svg#diffuse"
36
+
href="images/diffuse-current.svg#diffuse"></use>
37
+
</svg>
38
+
</h1>
39
+
<p>
40
+
Diffuse is a collection of custom elements that make it possible to
41
+
listen to audio from various sources on your devices and the web, and to create the ideal digital
42
+
listening experience for you.
43
+
</p>
44
+
<p>
45
+
<strong>⚠️ Heavily experimental</strong>
46
+
</p>
47
+
</header>
48
+
<main>
49
+
<div class="columns">
50
+
<!-- THEMES -->
51
+
<section>
52
+
<h2 id="themes">Themes</h2>
53
+
54
+
<p>
55
+
Themes are compositions and provide a traditional browser web application way of
56
+
using them. Each theme is unique, not just a skin (ie. not like winamp skins).
57
+
</p>
58
+
59
+
<p>
60
+
For example, most themes here will limit the currently playing audio tracks to one item,
61
+
but you might as well create a DJ theme that can play multiple items at the same time.
62
+
</p>
63
+
64
+
<ul>
65
+
<li>
66
+
<span class="todo">[todo]</span>
67
+
<span>Blur</span>
68
+
<div class="list-description"><strong>A DJ theme with an Apple-inspired playback view.</strong> Features two audio players instead of the usual one.</div>
69
+
</li>
70
+
<li>
71
+
<a href="themes/webamp/">Webamp</a>
72
+
<div class="list-description"><strong>Winamp 2 + Windows 98</strong>. Uses Webamp as the audio player connected to various Diffuse elements. Also features a desktop-like Windows 98 environment in which you can open "programs" that control the used Diffuse elements.</div>
73
+
</li>
74
+
</ul>
75
+
76
+
</section>
77
+
78
+
<!-- ABSTRACTIONS -->
79
+
<!--<section></section>-->
80
+
</div>
81
+
82
+
<!-- ELEMENTS -->
83
+
<section>
84
+
<h2 id="elements">Elements</h2>
85
+
86
+
<p>
87
+
The (web) components of the system. These
88
+
are then recombined into an entire music player experience, or whatever you want to build.
89
+
</p>
90
+
91
+
<div class="columns">
92
+
<div class="element">
93
+
<h3>Configurators</h3>
94
+
95
+
<p>
96
+
<em>
97
+
Elements that serve as an intermediate in order to make a particular kind of element configurable. In other words, these allow for an element to be swapped out with another that takes the same set of the actions and data output.
98
+
</em>
99
+
</p>
100
+
101
+
<ul>
102
+
<li>
103
+
<span class="todo">[todo]</span>
104
+
<span>Input</span>
105
+
<div class="list-description">Add multiple inputs.</div>
106
+
</li>
107
+
<li>
108
+
<span class="todo">[todo]</span>
109
+
<span>Output</span>
110
+
<div class="list-description">Allows the user to configure a specific output.</div>
111
+
</li>
112
+
<li>
113
+
<span class="todo">[todo]</span>
114
+
<span>Scrobbles</span>
115
+
<div class="list-description">Configure multiple scrobblers (music trackers).</div>
116
+
</li>
117
+
</ul>
118
+
119
+
</div>
120
+
121
+
122
+
<div class="element">
123
+
<h3>Engines</h3>
124
+
125
+
<p>
126
+
<em>
127
+
Elements with each a singular purpose and don't have any UI. There are specialised UI and orchestrator elements that control these.
128
+
</em>
129
+
</p>
130
+
131
+
<ul>
132
+
<li>
133
+
<a href="components/engine/audio/element.js">Audio</a>
134
+
<div class="list-description">Plays audio through audio elements.</div>
135
+
</li>
136
+
<li>
137
+
<a href="components/engine/queue/element.js">Queue</a>
138
+
<div class="list-description">A simple queue for tracks.</div>
139
+
</li>
140
+
</ul>
141
+
142
+
</div>
143
+
144
+
145
+
<div class="element">
146
+
<h3>Input</h3>
147
+
148
+
<p>
149
+
<em>
150
+
Inputs are sources of audio tracks. Each track is an entry in the list of possible items to play. These can be files or streams, static or dynamic.
151
+
</em>
152
+
</p>
153
+
154
+
<ul>
155
+
<li>
156
+
<a href="components/input/opensubsonic/element.js">Opensubsonic</a>
157
+
<div class="list-description">Add any (open)subsonic server.</div>
158
+
</li>
159
+
<li>
160
+
<span class="todo">[todo]</span>
161
+
<span>S3</span>
162
+
<div class="list-description">AWS S3 and services that provide the same surface API such as Cloudflare R2.</div>
163
+
</li>
164
+
</ul>
165
+
166
+
</div>
167
+
168
+
169
+
<div class="element">
170
+
<h3>Orchestrators</h3>
171
+
172
+
<p>
173
+
<em>
174
+
These too are element compositions. However, unlike themes, these are purely logical. Mostly exist in order to construct sensible defaults to use across themes and other compositions.
175
+
</em>
176
+
</p>
177
+
178
+
<ul>
179
+
<li>
180
+
<a href="components/orchestrator/process-tracks/element.js">Process inputs into tracks</a>
181
+
<div class="list-description">Whenever the cached tracks are initially loaded through the passed output element it will contextualize and then list tracks by using the passed input element. Afterwards it loops over all tracks and checks if metadata needs to be fetched. If anything has changed, it'll pass the results to the output element.</div>
182
+
</li>
183
+
<li>
184
+
<a href="components/orchestrator/queue-audio/element.js">Queue ⭤ Audio</a>
185
+
<div class="list-description">Connects the given queue engine to the given audio engine.</div>
186
+
</li>
187
+
<li>
188
+
<a href="components/orchestrator/queue-tracks/element.js">Queue ⭤ Tracks</a>
189
+
<div class="list-description">Sets the given queue element pool whenever the tracks signal from the given output changes.</div>
190
+
</li>
191
+
<li>
192
+
<a href="components/orchestrator/search-tracks/element.js">Search ⭤ Tracks</a>
193
+
<div class="list-description">Supplies tracks to the given search processor whenever the tracks collection changes.</div>
194
+
</li>
195
+
</ul>
196
+
197
+
</div>
198
+
199
+
200
+
<div class="element">
201
+
<h3>Output</h3>
202
+
203
+
<p>
204
+
<em>
205
+
Output is application-derived data such as playlists. These elements can receive such data and keep it around. These are categorised by the type of data they ingest, or many types in the case of polymorphic.
206
+
</em>
207
+
</p>
208
+
209
+
<ul>
210
+
<li>
211
+
<a href="components/output/polymorphic/indexed-db/element.js">Polymorphic / IndexedDB</a>
212
+
<div class="list-description">Stores output into the local indexedDB. Supports any type of data that indexedDB supports.</div>
213
+
</li>
214
+
</ul>
215
+
216
+
</div>
217
+
218
+
219
+
<div class="element">
220
+
<h3>Processors</h3>
221
+
222
+
<p>
223
+
<em>
224
+
These elements work with the output generated by the input elements to add more data to them, or process them in some other way.
225
+
</em>
226
+
</p>
227
+
228
+
<ul>
229
+
<li>
230
+
<a href="components/processor/artwork/element.js">Artwork</a>
231
+
<div class="list-description">Fetches cover art for a given set of tracks, stored locally in indexedDB. Checks the audio metadata first, then MusicBrainz and uses Last.fm as the fallback.</div>
232
+
</li>
233
+
<li>
234
+
<a href="components/processor/metadata/element.js">Metadata</a>
235
+
<div class="list-description">Fetch audio metadata for a given set of tracks, adding to the <code>Track</code> object.</div>
236
+
</li>
237
+
<li>
238
+
<a href="components/processor/search/element.js">Search</a>
239
+
<div class="list-description">Provides a way to search through a collection of tracks, powered by orama.js</div>
240
+
</li>
241
+
</ul>
242
+
243
+
</div>
244
+
245
+
246
+
<div class="element">
247
+
<h3>Supplements</h3>
248
+
249
+
<p>
250
+
<em>
251
+
Additional elements, such as scrobblers.
252
+
</em>
253
+
</p>
254
+
255
+
<ul>
256
+
<li>
257
+
<span class="todo">[todo]</span>
258
+
<span>Last.fm scrobbler</span>
259
+
</li>
260
+
<li>
261
+
<span class="todo">[todo]</span>
262
+
<span>ListenBrainz scrobbler</span>
263
+
</li>
264
+
<li>
265
+
<span class="todo">[todo]</span>
266
+
<span>Rocksky scrobbler</span>
267
+
</li>
268
+
<li>
269
+
<span class="todo">[todo]</span>
270
+
<span>Teal.fm scrobbler</span>
271
+
</li>
272
+
</ul>
273
+
274
+
</div>
275
+
276
+
277
+
<div class="element">
278
+
<h3>Transformers</h3>
279
+
280
+
<p>
281
+
<em>
282
+
Transform data from one format or schema into another. See schema section below for more information. Just as configurators, these are intermediates and require to have the same set of actions as the element it targets.
283
+
</em>
284
+
</p>
285
+
286
+
<ul>
287
+
<li>
288
+
<span class="todo">[todo]</span>
289
+
<span>Output / Bytes / Cambria lenses</span>
290
+
<div class="list-description">Uses the Cambria library to seamlessly translate between data schemas so that no data migration is needed.</div>
291
+
</li>
292
+
<li>
293
+
<span class="todo">[todo]</span>
294
+
<span>Output / Bytes / JSON</span>
295
+
<div class="list-description">Raw data schema output ⇄ JSON Uint8Array.</div>
296
+
</li>
297
+
<li>
298
+
<a href="components/transformer/output/string/json/element.js">Output / String / JSON</a>
299
+
<div class="list-description">Raw data schema output ⇄ JSON UTF8 string.</div>
300
+
</li>
301
+
</ul>
302
+
303
+
</div>
304
+
305
+
</div>
306
+
</section>
307
+
308
+
<!-- DEFINITIONS -->
309
+
<section>
310
+
<h2 id="definitions">Definitions</h2>
311
+
312
+
<p>All of the elements here are built with these data definitions in mind. That said, you can mix elements that use different definitions; you just have to put a transformer between them in order to translate between them.</p>
313
+
314
+
<ul>
315
+
<li>
316
+
<span class="todo">[todo]</span>
317
+
<span>Output / Favourites</span>
318
+
<div class="list-description">Indicate a user's favourite audio. Not a property of a track because tracks are associated with a specific source. Favourites may match with multiple tracks. Specified using the audio's title and artist.</div>
319
+
</li>
320
+
<li>
321
+
<span class="todo">[todo]</span>
322
+
<span>Output / Playlist</span>
323
+
<div class="list-description">Just like favourites, does not refer to specific tracks. Unlike favourites, must also specify the album. Can also be considered a collection which is basically an unordered playlist.</div>
324
+
</li>
325
+
<li>
326
+
<span class="todo">[todo]</span>
327
+
<span>Output / Progress</span>
328
+
<div class="list-description">Used to track progress of (long) audio playback.</div>
329
+
</li>
330
+
<li>
331
+
<a href="definitions/output/tracks.json">Output / Tracks</a>
332
+
<div class="list-description">Represents audio that can be played, or a placeholder for a source of tracks. Contains a URI that will resolve to the audio. This object may be cached if convenient.</div>
333
+
</li>
334
+
</ul>
335
+
336
+
</section>
337
+
338
+
<!-- DEMOS -->
339
+
<!--<section>
340
+
<h2 id="demos">Demos</h2>
341
+
342
+
<p>Just some utility web pages to help demo the system.</p>
343
+
344
+
<List items={demos} />
345
+
</section>-->
346
+
347
+
<!-- BUILD YOUR OWN -->
348
+
<!--<section></section>-->
349
+
</main>
350
+
351
+
</body>
352
+
</html>
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/mstile-150x150.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/mstile-150x150.png
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/mstile-150x150.png
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/node_crypto-TRGY7S2Z.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/node_crypto-TRGY7S2Z.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/node_crypto-TRGY7S2Z.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/node_crypto-TRGY7S2Z.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/node_crypto-TRGY7S2Z.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/node_crypto-TRGY7S2Z.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/safari-pinned-tab.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/safari-pinned-tab.svg
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/safari-pinned-tab.svg
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/animations.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/animations.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/animations.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/animations.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/animations.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/animations.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/colors.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/colors.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/diffuse/colors.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/colors.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/colors.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/diffuse/colors.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/fonts.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/fonts.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/diffuse/fonts.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/fonts.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/diffuse/fonts.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/diffuse/fonts.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/fonts.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/fonts.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/fonts.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/fonts.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/fonts.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/fonts.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/reset.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/reset.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/reset.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/reset.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/reset.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/reset.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/variables.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/variables.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/variables.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/variables.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/variables.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/variables.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/vendor/98.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/vendor/98.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/vendor/98.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/vendor/98.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/styles/vendor/98.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/styles/vendor/98.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/blur/index.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/blur/index.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.html
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.html
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/blur/index.html
+34
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.js
+34
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.js
···
1
+
import "../../chunk-3HGKPWGP.js";
2
+
import {
3
+
element_exports as element_exports2
4
+
} from "../../chunk-M4KBNR7K.js";
5
+
import "../../chunk-RMIZJ6MT.js";
6
+
import "../../chunk-BSW55ML6.js";
7
+
import "../../chunk-A3VEGVMA.js";
8
+
import "../../chunk-QQLIOIYP.js";
9
+
import {
10
+
element_exports
11
+
} from "../../chunk-FAZWEBEJ.js";
12
+
import "../../chunk-2G4V2WLU.js";
13
+
import "../../chunk-QL3YB5K6.js";
14
+
import "../../chunk-7WBXGB7R.js";
15
+
import "../../chunk-YHA4F5AN.js";
16
+
import {
17
+
component
18
+
} from "../../chunk-GULCWZMN.js";
19
+
import "../../chunk-SR6AOZ6U.js";
20
+
import {
21
+
effect
22
+
} from "../../chunk-LGHY5MKC.js";
23
+
import "../../chunk-B2VGR7JE.js";
24
+
25
+
// themes/blur/index.js
26
+
var output = component(element_exports2);
27
+
var queue = component(element_exports);
28
+
globalThis.output = output;
29
+
globalThis.queue = queue;
30
+
effect(() => {
31
+
console.log("Active queue item:", queue.now());
32
+
});
33
+
34
+
//# sourceMappingURL=./index.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/index.js.map
···
1
+
{"version":3,"sources":["/index.js"],"sourcesContent":["import \"@components/engine/audio/element.js\";\nimport \"@components/input/opensubsonic/element.js\";\nimport \"@components/orchestrator/process-tracks/element.js\";\nimport \"@components/orchestrator/queue-audio/element.js\";\nimport \"@components/orchestrator/queue-tracks/element.js\";\nimport \"@components/processor/metadata/element.js\";\n\nimport * as Output from \"@components/output/polymorphic/indexed-db/element.js\";\nimport * as Queue from \"@components/engine/queue/element.js\";\n\nimport { component } from \"@common/element.js\";\nimport { effect } from \"@common/signal.js\";\n\nconst output = component(Output);\nconst queue = component(Queue);\n\nglobalThis.output = output;\nglobalThis.queue = queue;\n\neffect(() => {\n console.log(\"Active queue item:\", queue.now());\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAM,SAAS,UAAUA,gBAAM;AAC/B,IAAM,QAAQ,UAAU,eAAK;AAE7B,WAAW,SAAS;AACpB,WAAW,QAAQ;AAEnB,OAAO,MAAM;AACX,UAAQ,IAAI,sBAAsB,MAAM,IAAI,CAAC;AAC/C,CAAC;","names":["element_exports"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/blur/index.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/variables.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/variables.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/blur/variables.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/variables.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/blur/variables.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/blur/variables.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/98-vars.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/98-vars.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/98-vars.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/98-vars.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/98-vars.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/98-vars.css.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/browser/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/browser/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-NCPT4TRJ.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/browser/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/browser/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/browser/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.css
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/index.css
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.css.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.css.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/index.css.map
+108
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.html
+108
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/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
+
<link href="index.css" rel="stylesheet" />
9
+
</head>
10
+
<body>
11
+
<!--
12
+
13
+
UI
14
+
15
+
-->
16
+
<main>
17
+
<section class="windows">
18
+
<dtw-window-manager>
19
+
<!-- INPUT -->
20
+
<dtw-window id="input-window">
21
+
<span slot="title-icon"><img src="../../images/icons/windows_98/cd_audio_cd_a-0.png" height="14" /></span>
22
+
<span slot="title">Manage audio inputs</span>
23
+
<p>👀</p>
24
+
</dtw-window>
25
+
26
+
<!-- OUTPUT -->
27
+
<dtw-window id="output-window">
28
+
<span slot="title-icon"><img src="../../images/icons/windows_98/computer_user_pencil-0.png" height="14" /></span>
29
+
<span slot="title">Manage user data</span>
30
+
<p>👀</p>
31
+
</dtw-window>
32
+
33
+
<!-- BROWSER -->
34
+
<dtw-window id="browser-window" open>
35
+
<span slot="title-icon"><img src="../../images/icons/windows_98/directory_explorer-4.png" height="14" /></span>
36
+
<span slot="title">Browse collection</span>
37
+
<dtw-browser
38
+
input-selector="di-opensubsonic"
39
+
output-selector="#output"
40
+
queue-selector="de-queue"
41
+
></dtw-browser>
42
+
</dtw-window>
43
+
</dtw-window-manager>
44
+
</section>
45
+
<section class="desktop">
46
+
<!-- WINAMP -->
47
+
<a class="button desktop__item" id="desktop-winamp">
48
+
<img src="../../images/icons/windows_98/winamp2-32x32.png" height="32" />
49
+
<label>Winamp</label>
50
+
</a>
51
+
52
+
<!-- INPUT -->
53
+
<a class="button desktop__item">
54
+
<img src="../../images/icons/windows_98/cd_audio_cd_a-4.png" height="32" />
55
+
<label for="input-window">Manage audio inputs</label>
56
+
</a>
57
+
58
+
<!-- OUTPUT -->
59
+
<a class="button desktop__item">
60
+
<img src="../../images/icons/windows_98/computer_user_pencil-0.png" height="32" />
61
+
<label for="output-window">Manage user data</label>
62
+
</a>
63
+
64
+
<!-- BROWSE -->
65
+
<a class="button desktop__item">
66
+
<img src="../../images/icons/windows_98/directory_explorer-5.png" height="32" />
67
+
<label for="browser-window">Browse collection</label>
68
+
</a>
69
+
</section>
70
+
<dtw-webamp></dtw-webamp>
71
+
</main>
72
+
73
+
<!--
74
+
75
+
COMPONENTS
76
+
77
+
-->
78
+
<de-queue></de-queue>
79
+
80
+
<!-- Inputs, Output & Processors -->
81
+
<di-opensubsonic></di-opensubsonic>
82
+
<dop-indexed-db></dop-indexed-db>
83
+
<dp-metadata></dp-metadata>
84
+
85
+
<!-- Transformers -->
86
+
<dtos-json id="output" output-selector="dop-indexed-db"></dtos-json>
87
+
88
+
<!-- Orchestrators -->
89
+
<!--<do-process-tracks
90
+
input-selector="di-opensubsonic"
91
+
metadata-processor-selector="dp-metadata"
92
+
output-selector="#output"
93
+
></do-process-tracks>-->
94
+
95
+
<do-queue-tracks
96
+
input-selector="di-opensubsonic"
97
+
output-selector="#output"
98
+
queue-engine-selector="de-queue"
99
+
></do-queue-tracks>
100
+
101
+
<!--
102
+
103
+
SCRIPTS
104
+
105
+
-->
106
+
<script src="index.js" type="module"></script>
107
+
</body>
108
+
</html>
+132
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.js
+132
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.js
···
1
+
import "../../chunk-VBPEFHHO.js";
2
+
import "../../chunk-K5J7GJD6.js";
3
+
import "../../chunk-7KGRAMQL.js";
4
+
import "../../chunk-3HGKPWGP.js";
5
+
import "../../chunk-NCPT4TRJ.js";
6
+
import {
7
+
element_default
8
+
} from "../../chunk-PGGLVZPS.js";
9
+
import "../../chunk-M4KBNR7K.js";
10
+
import "../../chunk-RMIZJ6MT.js";
11
+
import "../../chunk-A3VEGVMA.js";
12
+
import "../../chunk-QQLIOIYP.js";
13
+
import {
14
+
element_exports
15
+
} from "../../chunk-FAZWEBEJ.js";
16
+
import {
17
+
element_exports as element_exports2
18
+
} from "../../chunk-2G4V2WLU.js";
19
+
import "../../chunk-QL3YB5K6.js";
20
+
import "../../chunk-7WBXGB7R.js";
21
+
import {
22
+
component
23
+
} from "../../chunk-GULCWZMN.js";
24
+
import "../../chunk-SR6AOZ6U.js";
25
+
import {
26
+
effect,
27
+
signal,
28
+
untracked
29
+
} from "../../chunk-LGHY5MKC.js";
30
+
import {
31
+
__name
32
+
} from "../../chunk-B2VGR7JE.js";
33
+
34
+
// themes/webamp/index.js
35
+
var input = component(element_exports2);
36
+
var queue = component(element_exports);
37
+
globalThis.queue = queue;
38
+
var currBase = 0;
39
+
var $currTrack = signal(
40
+
/** @type {null | number} */
41
+
null
42
+
);
43
+
var $playlist = signal(
44
+
/** @type {Set<string>} */
45
+
/* @__PURE__ */ new Set(),
46
+
{
47
+
eager: true
48
+
}
49
+
);
50
+
var ampElement = document.querySelector("dtw-webamp");
51
+
if (ampElement instanceof element_default === false) {
52
+
throw new Error("Missing webamp element");
53
+
}
54
+
var amp = ampElement.amp;
55
+
var loadFromUrl = amp.media.loadFromUrl.bind(amp.media);
56
+
async function loadOverride(uri, autoPlay) {
57
+
const resp = await input.resolve({ method: "GET", uri });
58
+
if (!resp) throw new Error("Failed to resolve URI");
59
+
if (resp && "stream" in resp) {
60
+
throw new Error("Webamp does not support playing streams.");
61
+
}
62
+
return await loadFromUrl(resp.url, autoPlay);
63
+
}
64
+
__name(loadOverride, "loadOverride");
65
+
amp.media.loadFromUrl = loadOverride.bind(amp.media);
66
+
amp.store.subscribe(() => {
67
+
const state = amp.store.getState();
68
+
if (state.playlist.currentTrack !== null && state.playlist.currentTrack - currBase > 0) {
69
+
$currTrack.value = state.playlist.currentTrack - currBase;
70
+
}
71
+
});
72
+
effect(() => {
73
+
const now = untracked(queue.now);
74
+
const past = untracked(queue.past);
75
+
const future = queue.future();
76
+
const playlist = [
77
+
...past,
78
+
...now ? [now] : [],
79
+
...future
80
+
];
81
+
const oldSet = untracked($playlist.get);
82
+
const newSet = new Set(playlist.map((i) => i.id));
83
+
const addedItems = newSet.difference(oldSet);
84
+
if (addedItems.size === 0) return;
85
+
playlist.forEach((item, idx) => {
86
+
if (addedItems.has(item.id) === false) return;
87
+
if (item.stats?.duration == void 0) return;
88
+
ampElement.addTrack(item);
89
+
});
90
+
if (untracked($currTrack.get) === null) {
91
+
amp.setCurrentTrack(past.length);
92
+
}
93
+
$playlist.value = newSet;
94
+
});
95
+
effect(() => {
96
+
if (($currTrack.value ?? 0) > untracked(queue.past).length) {
97
+
queue.shift();
98
+
}
99
+
});
100
+
effect(() => {
101
+
const _trigger = queue.now();
102
+
queue.fill({ amount: 10, shuffled: true });
103
+
});
104
+
effect(() => {
105
+
const _trigger = queue.poolHash();
106
+
queue.fill({ amount: 10, shuffled: true });
107
+
if (!queue.now) queue.shift();
108
+
});
109
+
document.body.querySelectorAll(".desktop__item").forEach((element) => {
110
+
if (element instanceof HTMLElement) {
111
+
element.addEventListener("dblclick", () => {
112
+
const f = element.querySelector("label")?.getAttribute("for");
113
+
if (f) {
114
+
document.body.querySelector(`dtw-window#${f}`)?.toggleAttribute("open");
115
+
}
116
+
});
117
+
}
118
+
});
119
+
var winampIsShown = true;
120
+
document.body.querySelector("#desktop-winamp")?.addEventListener(
121
+
"dblclick",
122
+
() => {
123
+
if (winampIsShown) amp.close();
124
+
else {
125
+
amp.reopen();
126
+
winampIsShown = true;
127
+
}
128
+
}
129
+
);
130
+
amp.onClose(() => winampIsShown = false);
131
+
132
+
//# sourceMappingURL=./index.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/index.js.map
···
1
+
{"version":3,"sources":["/index.js"],"sourcesContent":["import \"@components/orchestrator/process-tracks/element.js\";\nimport \"@components/orchestrator/queue-tracks/element.js\";\nimport \"@components/output/polymorphic/indexed-db/element.js\";\nimport \"@components/processor/metadata/element.js\";\nimport \"@components/transformer/output/string/json/element.js\";\n\nimport * as Input from \"@components/input/opensubsonic/element.js\";\nimport * as Queue from \"@components/engine/queue/element.js\";\n\nimport { component } from \"@common/element.js\";\nimport { effect, signal, untracked } from \"@common/signal.js\";\n\nimport \"./browser/element.js\";\nimport \"./window/element.js\";\nimport \"./window-manager/element.js\";\nimport WebampElement from \"./webamp/element.js\";\n\nconst input = component(Input);\nconst queue = component(Queue);\n\nglobalThis.queue = queue;\n\n////////////////////////////////////////////\n// 📡\n////////////////////////////////////////////\n\nconst currBase = 0;\n\nconst $currTrack = signal(/** @type {null | number} */ (null));\nconst $playlist = signal(/** @type {Set<string>} */ (new Set()), {\n eager: true,\n});\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 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 * Observe changes in Webamp's internal store.\n */\namp.store.subscribe(() => {\n const state = amp.store.getState();\n\n if (\n state.playlist.currentTrack !== null &&\n state.playlist.currentTrack - currBase > 0\n ) {\n $currTrack.value = state.playlist.currentTrack - currBase;\n }\n});\n\n/**\n * Whenever the queue changes update the playlist.\n */\neffect(() => {\n const now = untracked(queue.now);\n const past = untracked(queue.past);\n const future = queue.future();\n\n const playlist = [\n ...past,\n ...(now ? [now] : []),\n ...future,\n ];\n\n const oldSet = untracked($playlist.get);\n const newSet = new Set(playlist.map((i) => i.id));\n\n const addedItems = newSet.difference(oldSet);\n\n // TODO: Can't do removals yet without resetting the webamp instance.\n // const removedItems = oldSet.difference(newSet);\n\n if (addedItems.size === 0) return;\n\n playlist.forEach((item, idx) => {\n if (addedItems.has(item.id) === false) return;\n\n // TODO\n if (item.stats?.duration == undefined) return;\n\n // TODO: Inserting at a specific index doesn't work\n ampElement.addTrack(item);\n });\n\n if (untracked($currTrack.get) === null) {\n amp.setCurrentTrack(past.length);\n }\n\n $playlist.value = newSet;\n});\n\n/**\n * Whenever Webamp's queue changes,\n * reflect the change in our queue too.\n */\neffect(() => {\n if (($currTrack.value ?? 0) > untracked(queue.past).length) {\n queue.shift();\n }\n});\n\n/**\n * AUTOPLAY:\n * Make sure there's always some random tracks in the queue.\n */\neffect(() => {\n const _trigger = queue.now();\n queue.fill({ amount: 10, shuffled: true });\n});\n\neffect(() => {\n const _trigger = queue.poolHash();\n queue.fill({ amount: 10, shuffled: true });\n\n // Automatically insert track if there isn't any\n if (!queue.now) queue.shift();\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) {\n document.body.querySelector(`dtw-window#${f}`)?.toggleAttribute(\"open\");\n }\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) amp.close();\n else {\n amp.reopen();\n winampIsShown = true;\n }\n },\n);\n\namp.onClose(() => winampIsShown = false);\n\n// TODO:\n// amp.onMinimize(() => amp.close());\n"],"mappings":"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","names":["element_exports"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/webamp/index.js.map"}
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/webamp/element.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/webamp/element.js
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/webamp/element.js
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/webamp/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/webamp/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/webamp/element.js.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window-manager/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window-manager/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-VBPEFHHO.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window-manager/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window-manager/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/window-manager/element.js.map
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window/element.js
+16
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window/element.js
···
1
+
import {
2
+
CLASS,
3
+
NAME,
4
+
element_default
5
+
} from "../../../chunk-K5J7GJD6.js";
6
+
import "../../../chunk-GULCWZMN.js";
7
+
import "../../../chunk-SR6AOZ6U.js";
8
+
import "../../../chunk-LGHY5MKC.js";
9
+
import "../../../chunk-B2VGR7JE.js";
10
+
export {
11
+
CLASS,
12
+
NAME,
13
+
element_default as default
14
+
};
15
+
16
+
//# sourceMappingURL=./element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window/element.js.map
+1
artifacts/bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m/themes/webamp/window/element.js.map
···
1
+
/var/home/toko/Code/tokono.ma/diffuse-artifacts/artifacts/bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni/themes/webamp/window/element.js.map
+4
artifacts/versions.json
+4
artifacts/versions.json
···
2
2
"4.0.0-alpha.1763310163": {
3
3
"cid": "bafybeiblem5rmxjlnh5mxucb76kj6smdng3te7q3lwmyhh2dhgdslkngni",
4
4
"version": "4.0.0-alpha.1763310163"
5
+
},
6
+
"4.0.0-alpha.1763640482": {
7
+
"cid": "bafybeifnnleaom7cmmljvw45ncn5tqcthkbawxyebaqdrd6q43avnixm5m",
8
+
"version": "4.0.0-alpha.1763640482"
5
9
}
6
10
}
+27
common/index.ts
+27
common/index.ts
···
1
+
import * as Path from "@std/path";
2
+
3
+
export function execSync(...args: string[]) {
4
+
const cmd = new Deno.Command(args[0], {
5
+
args: args.slice(1),
6
+
});
7
+
8
+
return cmd.outputSync();
9
+
}
10
+
11
+
export function writeCar(path: string, cid: string) {
12
+
execSync(
13
+
"deno",
14
+
"run",
15
+
"-A",
16
+
"ipfs-car",
17
+
"pack",
18
+
path,
19
+
"--no-wrap",
20
+
"--output",
21
+
Path.join("cars", `${cid}.car`),
22
+
);
23
+
}
24
+
25
+
export function utf8String(bytes: Uint8Array) {
26
+
return new TextDecoder().decode(bytes);
27
+
}
+6
-2
deno.jsonc
+6
-2
deno.jsonc
···
1
1
{
2
2
"imports": {
3
3
"@atikayda/kjson": "jsr:@atikayda/kjson@^1.2.2",
4
+
"@ipld/dag-json": "npm:@ipld/dag-json@^10.2.5",
5
+
"@ipld/dag-pb": "npm:@ipld/dag-pb@^4.1.5",
4
6
"@std/fs": "jsr:@std/fs@^1.0.19",
5
7
"@std/path": "jsr:@std/path@^1.1.2",
8
+
"blockstore-core": "npm:blockstore-core@^6.1.1",
6
9
"ipfs-car": "npm:ipfs-car@^3.1.0",
10
+
"ipfs-unixfs-importer": "npm:ipfs-unixfs-importer@^16.0.1",
11
+
"multiformats": "npm:multiformats@^13.4.1",
7
12
},
8
13
"tasks": {
9
14
"add-artifact": "deno run -A tasks/add-artifact.ts",
10
15
"build": "deno run add-artifact && deno run generate-redirects && deno run de-duplicate",
11
16
"de-duplicate": "fclones group artifacts/ | fclones link --soft",
12
17
"generate-redirects": "deno run --allow-read --allow-write=artifacts/ ./tasks/generate-redirects.ts",
13
-
"regenerate-cars": "deno run -A tasks/regenerate-cars.ts",
14
18
"sync-diffuse": "git submodule update --init --recursive --remote",
15
19
16
20
// Deployments
17
21
"deploy:netlify": "npx netlify deploy --prod",
18
-
"deploy:ipfs": "deno run build && ipfs add artifacts/ --recursive --cid-version=1 --hidden --max-directory-links=1000 --chunker=size-1048576",
22
+
"deploy:ipfs": "deno run build && deno run -A tasks/deploy/ipfs.ts",
19
23
},
20
24
"compilerOptions": {
21
25
"checkJs": true,
+259
-6
deno.lock
+259
-6
deno.lock
···
7
7
"jsr:@std/internal@^1.0.9": "1.0.12",
8
8
"jsr:@std/path@^1.1.1": "1.1.2",
9
9
"jsr:@std/path@^1.1.2": "1.1.2",
10
+
"npm:@ipld/dag-json@^10.2.5": "10.2.5",
11
+
"npm:@ipld/dag-pb@^4.1.5": "4.1.5",
12
+
"npm:blockstore-core@^6.1.1": "6.1.1",
10
13
"npm:ipfs-car@^3.1.0": "3.1.0",
14
+
"npm:ipfs-unixfs-importer@^16.0.1": "16.0.1",
15
+
"npm:multiformats@^13.4.1": "13.4.1",
11
16
"npm:proposal-decimal@20250613.0.0": "20250613.0.0"
12
17
},
13
18
"jsr": {
···
35
40
}
36
41
},
37
42
"npm": {
43
+
"@assemblyscript/loader@0.9.4": {
44
+
"integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA=="
45
+
},
46
+
"@chainsafe/is-ip@2.1.0": {
47
+
"integrity": "sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w=="
48
+
},
38
49
"@ipld/car@5.4.2": {
39
50
"integrity": "sha512-gfyrJvePyXnh2Fbj8mPg4JYvEZ3izhk8C9WgAle7xIYbrJNSXmNQ6BxAls8Gof97vvGbCROdxbTWRmHJtTCbcg==",
40
51
"dependencies": [
···
76
87
"rabin-rs"
77
88
]
78
89
},
90
+
"@leichtgewicht/ip-codec@2.0.5": {
91
+
"integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="
92
+
},
93
+
"@libp2p/interface@3.1.0": {
94
+
"integrity": "sha512-RE7/XyvC47fQBe1cHxhMvepYKa5bFCUyFrrpj8PuM0E7JtzxU7F+Du5j4VXbg2yLDcToe0+j8mB7jvwE2AThYw==",
95
+
"dependencies": [
96
+
"@multiformats/dns",
97
+
"@multiformats/multiaddr",
98
+
"main-event",
99
+
"multiformats",
100
+
"progress-events",
101
+
"uint8arraylist"
102
+
]
103
+
},
104
+
"@libp2p/logger@6.2.2": {
105
+
"integrity": "sha512-XtanXDT+TuMuZoCK760HGV1AmJsZbwAw5AiRUxWDbsZPwAroYq64nb41AHRu9Gyc0TK9YD+p72+5+FIxbw0hzw==",
106
+
"dependencies": [
107
+
"@libp2p/interface",
108
+
"@multiformats/multiaddr",
109
+
"interface-datastore",
110
+
"multiformats",
111
+
"weald"
112
+
]
113
+
},
79
114
"@multiformats/blake2@2.0.2": {
80
115
"integrity": "sha512-AOWu6Tyuk5UoT5m4faB6ntVnPB8EmuD6rn18s4cCgHNEGgsamT8GdvjP9DYjzFHQVaP/0L3CaKqWQqJlXx9ecw==",
81
116
"dependencies": [
82
117
"blakejs",
83
118
"multiformats"
119
+
]
120
+
},
121
+
"@multiformats/dns@1.0.10": {
122
+
"integrity": "sha512-6X200ceQLns0b/CU0S/So16tGjB5eIXHJ1xvJMPoWaKFHWSgfpW2EhkWJrqap4U3+c37zcowVR0ToPXeYEL7Vw==",
123
+
"dependencies": [
124
+
"buffer",
125
+
"dns-packet",
126
+
"hashlru",
127
+
"p-queue@9.0.0",
128
+
"progress-events",
129
+
"uint8arrays"
130
+
]
131
+
},
132
+
"@multiformats/multiaddr@13.0.1": {
133
+
"integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==",
134
+
"dependencies": [
135
+
"@chainsafe/is-ip",
136
+
"multiformats",
137
+
"uint8-varint",
138
+
"uint8arrays"
84
139
]
85
140
},
86
141
"@multiformats/murmur3@2.1.8": {
···
160
215
"actor@2.3.1": {
161
216
"integrity": "sha512-ST/3wnvcP2tKDXnum7nLCLXm+/rsf8vPocXH2Fre6D8FQwNkGDd4JEitBlXj007VQJfiGYRQvXqwOBZVi+JtRg=="
162
217
},
218
+
"base64-js@1.5.1": {
219
+
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
220
+
},
221
+
"bl@5.1.0": {
222
+
"integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
223
+
"dependencies": [
224
+
"buffer",
225
+
"inherits",
226
+
"readable-stream"
227
+
]
228
+
},
163
229
"blakejs@1.2.1": {
164
230
"integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="
165
231
},
232
+
"blockstore-core@6.1.1": {
233
+
"integrity": "sha512-swHp4vMywzPbsfDQiPzaAHL2A/5Qz5exlh69LNoPRv+tg23wD6N8IWDFdzXw34RsRQKXm+UWQIRcde+uppMRuA==",
234
+
"dependencies": [
235
+
"@libp2p/logger",
236
+
"interface-blockstore@6.0.1",
237
+
"interface-store@7.0.1",
238
+
"it-all",
239
+
"it-filter",
240
+
"it-merge",
241
+
"multiformats"
242
+
]
243
+
},
244
+
"buffer@6.0.3": {
245
+
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
246
+
"dependencies": [
247
+
"base64-js",
248
+
"ieee754"
249
+
]
250
+
},
166
251
"cborg@4.3.0": {
167
252
"integrity": "sha512-vOXo1pB4mdeBw3LbpoynQlZNw/H3kZVHLtPYlp8kFMreL/2YfT54F70BM1s3iDoCtQ+3C9QmiRF4rfCSSTlhBw==",
168
253
"bin": true
254
+
},
255
+
"debug@4.4.3": {
256
+
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
257
+
"dependencies": [
258
+
"ms@2.1.3"
259
+
]
260
+
},
261
+
"dns-packet@5.6.1": {
262
+
"integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
263
+
"dependencies": [
264
+
"@leichtgewicht/ip-codec"
265
+
]
169
266
},
170
267
"eventemitter3@5.0.1": {
171
268
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
···
186
283
"uint8arrays"
187
284
]
188
285
},
286
+
"hashlru@2.3.0": {
287
+
"integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A=="
288
+
},
289
+
"ieee754@1.2.1": {
290
+
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
291
+
},
292
+
"inherits@2.0.4": {
293
+
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
294
+
},
189
295
"interface-blockstore@5.3.2": {
190
296
"integrity": "sha512-oA9Pjkxun/JHAsZrYEyKX+EoPjLciTzidE7wipLc/3YoHDjzsnXRJzAzFJXNUvogtY4g7hIwxArx8+WKJs2RIg==",
191
297
"dependencies": [
192
-
"interface-store",
298
+
"interface-store@6.0.3",
299
+
"multiformats"
300
+
]
301
+
},
302
+
"interface-blockstore@6.0.1": {
303
+
"integrity": "sha512-AVcUbMwrhiO4RqDljUitUt3aoon6MD2fblsN7vEVBDsmHFQT0LIOODVK5Qxe28h1uUvVykyZqmo09f6w55KiJg==",
304
+
"dependencies": [
305
+
"interface-store@7.0.1",
193
306
"multiformats"
194
307
]
195
308
},
309
+
"interface-datastore@9.0.2": {
310
+
"integrity": "sha512-jebn+GV/5LTDDoyicNIB4D9O0QszpPqT09Z/MpEWvf3RekjVKpXJCDguM5Au2fwIFxFDAQMZe5bSla0jMamCNg==",
311
+
"dependencies": [
312
+
"interface-store@7.0.1",
313
+
"uint8arrays"
314
+
]
315
+
},
196
316
"interface-store@6.0.3": {
197
317
"integrity": "sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA=="
318
+
},
319
+
"interface-store@7.0.1": {
320
+
"integrity": "sha512-OPRRUO3Cs6Jr/t98BrJLQp1jUTPgrRH0PqFfuNoPAqd+J7ABN1tjFVjQdaOBiybYJTS/AyBSZnZVWLPvp3dW3w=="
198
321
},
199
322
"ipfs-car@3.1.0": {
200
323
"integrity": "sha512-0131+UNxk3+2baxK7qmlwJcl/SEI51v/Avx91LdP9WfSfh9s+/qkGS3ukwtmeG7YIyMLvTruRXPvHiYkz/ejVQ==",
···
221
344
"@ipld/dag-pb",
222
345
"@multiformats/murmur3",
223
346
"hamt-sharding",
224
-
"interface-blockstore",
225
-
"ipfs-unixfs",
347
+
"interface-blockstore@5.3.2",
348
+
"ipfs-unixfs@11.2.5",
226
349
"it-filter",
227
350
"it-last",
228
351
"it-map",
···
230
353
"it-pipe",
231
354
"it-pushable",
232
355
"multiformats",
233
-
"p-queue",
356
+
"p-queue@8.1.1",
234
357
"progress-events"
235
358
]
236
359
},
360
+
"ipfs-unixfs-importer@16.0.1": {
361
+
"integrity": "sha512-UAN9i6FB9Iren8AyF9gwN1Sa4Ud2caJE6TYzqZtO+iwX7x2BM0p+H8nomTtDTZ8EMREcZC304xu85sQE4wU+uQ==",
362
+
"dependencies": [
363
+
"@ipld/dag-pb",
364
+
"@multiformats/murmur3",
365
+
"hamt-sharding",
366
+
"interface-blockstore@6.0.1",
367
+
"interface-store@7.0.1",
368
+
"ipfs-unixfs@12.0.0",
369
+
"it-all",
370
+
"it-batch",
371
+
"it-first",
372
+
"it-parallel-batch",
373
+
"multiformats",
374
+
"progress-events",
375
+
"rabin-wasm",
376
+
"uint8arraylist",
377
+
"uint8arrays"
378
+
]
379
+
},
237
380
"ipfs-unixfs@11.2.5": {
238
381
"integrity": "sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==",
239
382
"dependencies": [
···
241
384
"uint8arraylist"
242
385
]
243
386
},
387
+
"ipfs-unixfs@12.0.0": {
388
+
"integrity": "sha512-6I2YSqYCxcr/u1xdWROQU+PkmG7NAMRpwNiFffU9lmSv1I4nCXRDRy6YFH7dg8v17+gM1w+ijBK31rZGrrF5Og==",
389
+
"dependencies": [
390
+
"protons-runtime",
391
+
"uint8arraylist"
392
+
]
393
+
},
394
+
"it-all@3.0.9": {
395
+
"integrity": "sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg=="
396
+
},
397
+
"it-batch@3.0.9": {
398
+
"integrity": "sha512-z6p89Q8gm2urBtF3JcpnbJogacijWk3m1uc3xZYI3x0eJUoYLUbgF8IxJ2fnuVObV7yRv3SixfwGCufaZY1NCg=="
399
+
},
244
400
"it-filter@3.1.4": {
245
401
"integrity": "sha512-80kWEKgiFEa4fEYD3mwf2uygo1dTQ5Y5midKtL89iXyjinruA/sNXl6iFkTcdNedydjvIsFhWLiqRPQP4fAwWQ==",
246
402
"dependencies": [
247
403
"it-peekable"
248
404
]
249
405
},
406
+
"it-first@3.0.9": {
407
+
"integrity": "sha512-ZWYun273Gbl7CwiF6kK5xBtIKR56H1NoRaiJek2QzDirgen24u8XZ0Nk+jdnJSuCTPxC2ul1TuXKxu/7eK6NuA=="
408
+
},
250
409
"it-last@3.0.9": {
251
410
"integrity": "sha512-AtfUEnGDBHBEwa1LjrpGHsJMzJAWDipD6zilvhakzJcm+BCvNX8zlX2BsHClHJLLTrsY4lY9JUjc+TQV4W7m1w=="
252
411
},
···
260
419
"integrity": "sha512-nnnFSUxKlkZVZD7c0jYw6rDxCcAQYcMsFj27thf7KkDhpj0EA0g9KHPxbFzHuDoc6US2EPS/MtplkNj8sbCx4Q==",
261
420
"dependencies": [
262
421
"it-queueless-pushable"
422
+
]
423
+
},
424
+
"it-parallel-batch@3.0.9": {
425
+
"integrity": "sha512-TszXWqqLG8IG5DUEnC4cgH9aZI6CsGS7sdkXTiiacMIj913bFy7+ohU3IqsFURCcZkpnXtNLNzrYnXISsKBhbQ==",
426
+
"dependencies": [
427
+
"it-batch"
263
428
]
264
429
},
265
430
"it-parallel@3.0.13": {
···
302
467
"long@5.3.2": {
303
468
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="
304
469
},
470
+
"main-event@1.0.1": {
471
+
"integrity": "sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw=="
472
+
},
473
+
"minimist@1.2.8": {
474
+
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
475
+
},
305
476
"mri@1.2.0": {
306
477
"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="
307
478
},
479
+
"ms@2.1.3": {
480
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
481
+
},
482
+
"ms@3.0.0-canary.202508261828": {
483
+
"integrity": "sha512-NotsCoUCIUkojWCzQff4ttdCfIPoA1UGZsyQbi7KmqkNRfKCrvga8JJi2PknHymHOuor0cJSn/ylj52Cbt2IrQ=="
484
+
},
308
485
"multiformats@13.4.1": {
309
486
"integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q=="
310
487
},
311
488
"murmurhash3js-revisited@3.0.0": {
312
489
"integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g=="
490
+
},
491
+
"node-fetch@2.7.0": {
492
+
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
493
+
"dependencies": [
494
+
"whatwg-url"
495
+
]
313
496
},
314
497
"p-defer@4.0.1": {
315
498
"integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A=="
···
318
501
"integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==",
319
502
"dependencies": [
320
503
"eventemitter3",
321
-
"p-timeout"
504
+
"p-timeout@6.1.4"
505
+
]
506
+
},
507
+
"p-queue@9.0.0": {
508
+
"integrity": "sha512-KO1RyxstL9g1mK76530TExamZC/S2Glm080Nx8PE5sTd7nlduDQsAfEl4uXX+qZjLiwvDauvzXavufy3+rJ9zQ==",
509
+
"dependencies": [
510
+
"eventemitter3",
511
+
"p-timeout@7.0.1"
322
512
]
323
513
},
324
514
"p-timeout@6.1.4": {
325
515
"integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="
516
+
},
517
+
"p-timeout@7.0.1": {
518
+
"integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="
326
519
},
327
520
"progress-events@1.0.1": {
328
521
"integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw=="
···
359
552
"rabin-rs@2.1.0": {
360
553
"integrity": "sha512-5y72gAXPzIBsAMHcpxZP8eMDuDT98qMP1BqSDHRbHkJJXEgWIN1lA47LxUqzsK6jknOJtgfkQr9v+7qMlFDm6g=="
361
554
},
555
+
"rabin-wasm@0.1.5": {
556
+
"integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==",
557
+
"dependencies": [
558
+
"@assemblyscript/loader",
559
+
"bl",
560
+
"debug",
561
+
"minimist",
562
+
"node-fetch",
563
+
"readable-stream"
564
+
],
565
+
"bin": true
566
+
},
362
567
"race-signal@1.1.3": {
363
568
"integrity": "sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA=="
364
569
},
570
+
"readable-stream@3.6.2": {
571
+
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
572
+
"dependencies": [
573
+
"inherits",
574
+
"string_decoder",
575
+
"util-deprecate"
576
+
]
577
+
},
365
578
"sade@1.8.1": {
366
579
"integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
367
580
"dependencies": [
368
581
"mri"
369
582
]
370
583
},
584
+
"safe-buffer@5.2.1": {
585
+
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
586
+
},
371
587
"sparse-array@1.3.2": {
372
588
"integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg=="
373
589
},
590
+
"string_decoder@1.3.0": {
591
+
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
592
+
"dependencies": [
593
+
"safe-buffer"
594
+
]
595
+
},
596
+
"supports-color@10.2.2": {
597
+
"integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="
598
+
},
599
+
"tr46@0.0.3": {
600
+
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
601
+
},
374
602
"uint8-varint@2.0.4": {
375
603
"integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==",
376
604
"dependencies": [
···
393
621
"undici-types@7.16.0": {
394
622
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="
395
623
},
624
+
"util-deprecate@1.0.2": {
625
+
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
626
+
},
396
627
"varint@6.0.0": {
397
628
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
629
+
},
630
+
"weald@1.1.1": {
631
+
"integrity": "sha512-PaEQShzMCz8J/AD2N3dJMc1hTZWkJeLKS2NMeiVkV5KDHwgZe7qXLEzyodsT/SODxWDdXJJqocuwf3kHzcXhSQ==",
632
+
"dependencies": [
633
+
"ms@3.0.0-canary.202508261828",
634
+
"supports-color"
635
+
]
636
+
},
637
+
"webidl-conversions@3.0.1": {
638
+
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
639
+
},
640
+
"whatwg-url@5.0.0": {
641
+
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
642
+
"dependencies": [
643
+
"tr46",
644
+
"webidl-conversions"
645
+
]
398
646
}
399
647
},
400
648
"workspace": {
···
402
650
"jsr:@atikayda/kjson@^1.2.2",
403
651
"jsr:@std/fs@^1.0.19",
404
652
"jsr:@std/path@^1.1.2",
405
-
"npm:ipfs-car@^3.1.0"
653
+
"npm:@ipld/dag-json@^10.2.5",
654
+
"npm:@ipld/dag-pb@^4.1.5",
655
+
"npm:blockstore-core@^6.1.1",
656
+
"npm:ipfs-car@^3.1.0",
657
+
"npm:ipfs-unixfs-importer@^16.0.1",
658
+
"npm:multiformats@^13.4.1"
406
659
]
407
660
}
408
661
}
+1
-1
tasks/add-artifact.ts
+1
-1
tasks/add-artifact.ts
···
3
3
4
4
import type { Artifact } from "../common/types.d.ts";
5
5
import { diffuseVersion } from "../common/diffuse-version.ts";
6
-
import { execSync, utf8String } from "./common/index.ts";
6
+
import { execSync, utf8String } from "../common/index.ts";
7
7
8
8
import artifactsJson from "../artifacts/artifacts.json" with { type: "json" };
9
9
import versionsJson from "../artifacts/versions.json" with { type: "json" };
-11
tasks/common/index.ts
-11
tasks/common/index.ts
+106
tasks/deploy/ipfs.ts
+106
tasks/deploy/ipfs.ts
···
1
+
// ipfs add artifacts/ --recursive --cid-version=1 --hidden --max-directory-links=1000 --chunker=size-1048576
2
+
3
+
import * as Fs from "@std/fs";
4
+
import * as Path from "@std/path";
5
+
import { cpSync } from "node:fs";
6
+
7
+
import { MemoryBlockstore } from "blockstore-core/memory";
8
+
import { importer } from "ipfs-unixfs-importer";
9
+
import { CID } from "multiformats/cid";
10
+
import * as DagPB from "@ipld/dag-pb";
11
+
12
+
import versionsJson from "../../artifacts/versions.json" with { type: "json" };
13
+
14
+
import type { Artifact } from "../../common/types.d.ts";
15
+
import { execSync, writeCar } from "../../common/index.ts";
16
+
17
+
const versions: Record<string, Artifact> = versionsJson as any;
18
+
19
+
////////////////////////////////////////////
20
+
// ADD CARS
21
+
////////////////////////////////////////////
22
+
23
+
Fs.ensureDirSync("cars");
24
+
25
+
Object.values(versions).forEach((artifact) => {
26
+
const carPath = Path.join("cars", artifact.cid + ".car");
27
+
const exists = Fs.existsSync(carPath);
28
+
29
+
if (!exists) {
30
+
const inputPath = Path.join("artifacts", artifact.cid);
31
+
const tmpDir = Deno.makeTempDirSync();
32
+
33
+
cpSync(inputPath, tmpDir, {
34
+
dereference: true,
35
+
preserveTimestamps: true,
36
+
recursive: true,
37
+
});
38
+
39
+
writeCar(tmpDir, artifact.cid);
40
+
41
+
Deno.removeSync(tmpDir, { recursive: true });
42
+
}
43
+
44
+
execSync(
45
+
"ipfs",
46
+
"dag",
47
+
"import",
48
+
carPath,
49
+
);
50
+
});
51
+
52
+
////////////////////////////////////////////
53
+
// GENERATE ROOT DAG
54
+
////////////////////////////////////////////
55
+
56
+
const blockstore = new MemoryBlockstore();
57
+
58
+
const source = [
59
+
"_redirects",
60
+
"artifacts.json",
61
+
"versions.json",
62
+
].map(
63
+
(path) => {
64
+
return {
65
+
path: path,
66
+
content: Deno.readFileSync("artifacts/" + path),
67
+
};
68
+
},
69
+
);
70
+
71
+
const links = [];
72
+
73
+
for await (const entry of importer(source, blockstore)) {
74
+
links.push(
75
+
DagPB.createLink(entry.path ?? "", Number(entry.size), entry.cid),
76
+
);
77
+
}
78
+
79
+
Object.values(versions).forEach((artifact) => {
80
+
links.push(
81
+
DagPB.createLink(artifact.cid, 0, CID.parse(artifact.cid)),
82
+
);
83
+
});
84
+
85
+
const bytes = DagPB.encode({
86
+
Data: new Uint8Array([8, 1]),
87
+
Links: links.toSorted((a, b) => {
88
+
const aName = a.Name ?? "";
89
+
const bName = b.Name ?? "";
90
+
91
+
if (aName < bName) return -1;
92
+
if (aName > bName) return 1;
93
+
return 0;
94
+
}),
95
+
});
96
+
97
+
const cmd = new Deno.Command("ipfs", {
98
+
args: ["dag", "put", "--store-codec", "dag-pb", "--input-codec", "dag-pb"],
99
+
stdin: "piped",
100
+
});
101
+
102
+
const process = cmd.spawn();
103
+
const writer = process.stdin.getWriter();
104
+
105
+
await writer.write(bytes);
106
+
await writer.close();
+12
-4
tasks/generate-redirects.ts
+12
-4
tasks/generate-redirects.ts
···
14
14
from: string;
15
15
to: string;
16
16
status?: number;
17
+
splat?: boolean;
17
18
};
19
+
20
+
// VERSIONS
18
21
19
22
let rules: Rule[] = Object.values(versions).flatMap((artifact) => {
20
23
return [
···
27
30
from: `/${artifact.version}`,
28
31
to: `/${artifact.cid}`,
29
32
status: 200,
33
+
splat: true,
30
34
},
31
35
];
32
36
});
37
+
38
+
// SYMLINKS
39
+
40
+
// FIXED ROUTES
33
41
34
42
const latest: Rule = {
35
43
from: "/latest/",
···
58
66
let redirects = "";
59
67
60
68
rules.forEach((rule) => {
61
-
if (rule.status === 302) {
62
-
redirects += `${rule.from} ${rule.to}${
69
+
if (rule.splat) {
70
+
redirects += `${rule.from}/ ${rule.to}/index.html 200\n`;
71
+
redirects += `${rule.from}/* ${rule.to}/:splat${
63
72
rule.status ? " " + rule.status : ""
64
73
}\n`;
65
74
} else {
66
-
redirects += `${rule.from}/ ${rule.to}/index.html 200\n`;
67
-
redirects += `${rule.from}/* ${rule.to}/:splat${
75
+
redirects += `${rule.from} ${rule.to}${
68
76
rule.status ? " " + rule.status : ""
69
77
}\n`;
70
78
}
-32
tasks/regenerate-cars.ts
-32
tasks/regenerate-cars.ts
···
1
-
import * as Fs from "@std/fs";
2
-
import * as Path from "@std/path";
3
-
4
-
import { execSync, utf8String } from "./common/index.ts";
5
-
6
-
const iterator = Fs.walkSync(
7
-
"artifacts",
8
-
{
9
-
includeDirs: true,
10
-
includeFiles: false,
11
-
maxDepth: 1,
12
-
},
13
-
);
14
-
15
-
Fs.ensureDirSync("cars");
16
-
17
-
for (const entry of iterator) {
18
-
if (entry.path === "artifacts") continue;
19
-
const cid = entry.name;
20
-
21
-
execSync(
22
-
"deno",
23
-
"run",
24
-
"-A",
25
-
"ipfs-car",
26
-
"pack",
27
-
entry.path,
28
-
"--no-wrap",
29
-
"--output",
30
-
Path.join("cars", `${cid}.car`),
31
-
);
32
-
}