signalk-piper 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -8
- package/dist/config.d.ts +127 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +208 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/service.d.ts +142 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +596 -0
- package/dist/service.js.map +1 -0
- package/dist/wyoming.d.ts +29 -0
- package/dist/wyoming.d.ts.map +1 -0
- package/dist/wyoming.js +124 -0
- package/dist/wyoming.js.map +1 -0
- package/package.json +63 -5
- package/public/172.mjs +1 -0
- package/public/540.mjs +2 -0
- package/public/540.mjs.LICENSE.txt +9 -0
- package/public/main.mjs +1 -0
- package/public/remoteEntry.js +1 -0
- package/index.js +0 -23
package/dist/wyoming.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal self-contained Wyoming `describe` client.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately embedded (no runtime dependency on the signalk-wyoming
|
|
5
|
+
* orchestrator package): connects, writes a header-only `describe` event and
|
|
6
|
+
* incrementally decodes events until an `info` event arrives, then resolves
|
|
7
|
+
* with its parsed data.
|
|
8
|
+
*
|
|
9
|
+
* Wire format (rhasspy/wyoming): one JSON header line terminated by "\n"
|
|
10
|
+
* with optional `data_length`/`payload_length` byte counts, followed by that
|
|
11
|
+
* many bytes of JSON data and binary payload. Non-`info` events are consumed
|
|
12
|
+
* and skipped.
|
|
13
|
+
*/
|
|
14
|
+
import net from "node:net";
|
|
15
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
16
|
+
const MAX_BUFFER_BYTES = 64 * 1024 * 1024;
|
|
17
|
+
/**
|
|
18
|
+
* Send `describe` to a Wyoming service and await its `info` response.
|
|
19
|
+
* Rejects on connection failure, malformed frames or timeout.
|
|
20
|
+
*/
|
|
21
|
+
export function describeService(host, port, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
22
|
+
const startedAt = Date.now();
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const socket = net.connect({ host, port });
|
|
25
|
+
let buf = Buffer.alloc(0);
|
|
26
|
+
let header = null;
|
|
27
|
+
let done = false;
|
|
28
|
+
const timer = setTimeout(() => {
|
|
29
|
+
fail(new Error(`describe timed out after ${timeoutMs}ms (${host}:${port})`));
|
|
30
|
+
}, timeoutMs);
|
|
31
|
+
function finish(result) {
|
|
32
|
+
if (done)
|
|
33
|
+
return;
|
|
34
|
+
done = true;
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
socket.destroy();
|
|
37
|
+
resolve(result);
|
|
38
|
+
}
|
|
39
|
+
function fail(err) {
|
|
40
|
+
if (done)
|
|
41
|
+
return;
|
|
42
|
+
done = true;
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
socket.destroy();
|
|
45
|
+
reject(err);
|
|
46
|
+
}
|
|
47
|
+
socket.once("error", (err) => fail(err));
|
|
48
|
+
socket.once("close", () => fail(new Error("connection closed before info")));
|
|
49
|
+
socket.once("connect", () => {
|
|
50
|
+
socket.write(JSON.stringify({ type: "describe" }) + "\n");
|
|
51
|
+
});
|
|
52
|
+
socket.on("data", (chunk) => {
|
|
53
|
+
if (done)
|
|
54
|
+
return;
|
|
55
|
+
buf = buf.length === 0 ? chunk : Buffer.concat([buf, chunk]);
|
|
56
|
+
if (buf.length > MAX_BUFFER_BYTES) {
|
|
57
|
+
fail(new Error("describe response exceeds buffer limit"));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
processBuffer();
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
fail(err instanceof Error ? err : new Error(String(err)));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
function processBuffer() {
|
|
68
|
+
for (;;) {
|
|
69
|
+
if (header === null) {
|
|
70
|
+
const nl = buf.indexOf(0x0a);
|
|
71
|
+
if (nl === -1)
|
|
72
|
+
return;
|
|
73
|
+
const line = buf.subarray(0, nl).toString("utf8");
|
|
74
|
+
buf = buf.subarray(nl + 1);
|
|
75
|
+
const parsed = JSON.parse(line);
|
|
76
|
+
if (!isObject(parsed) || typeof parsed.type !== "string") {
|
|
77
|
+
throw new Error("malformed Wyoming header");
|
|
78
|
+
}
|
|
79
|
+
header = {
|
|
80
|
+
type: parsed.type,
|
|
81
|
+
version: typeof parsed.version === "string" ? parsed.version : undefined,
|
|
82
|
+
dataLength: lengthOf(parsed.data_length),
|
|
83
|
+
payloadLength: lengthOf(parsed.payload_length),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const need = header.dataLength + header.payloadLength;
|
|
87
|
+
if (buf.length < need)
|
|
88
|
+
return;
|
|
89
|
+
const dataRaw = buf.subarray(0, header.dataLength).toString("utf8");
|
|
90
|
+
buf = buf.subarray(need);
|
|
91
|
+
if (header.type === "info") {
|
|
92
|
+
const data = header.dataLength > 0 ? JSON.parse(dataRaw) : {};
|
|
93
|
+
if (!isObject(data))
|
|
94
|
+
throw new Error("malformed info data");
|
|
95
|
+
const result = {
|
|
96
|
+
info: data,
|
|
97
|
+
latencyMs: Date.now() - startedAt,
|
|
98
|
+
};
|
|
99
|
+
if (header.version !== undefined)
|
|
100
|
+
result.version = header.version;
|
|
101
|
+
finish(result);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
header = null; // not info: skip the event, keep reading
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** True when a Wyoming protocol version string is in the supported 1.x range. */
|
|
110
|
+
export function isSupportedProtocolVersion(version) {
|
|
111
|
+
return /^1\./.test(version);
|
|
112
|
+
}
|
|
113
|
+
function isObject(v) {
|
|
114
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
115
|
+
}
|
|
116
|
+
function lengthOf(v) {
|
|
117
|
+
if (v === undefined || v === null)
|
|
118
|
+
return 0;
|
|
119
|
+
if (typeof v !== "number" || !Number.isInteger(v) || v < 0) {
|
|
120
|
+
throw new Error("invalid Wyoming length field");
|
|
121
|
+
}
|
|
122
|
+
return v;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=wyoming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wyoming.js","sourceRoot":"","sources":["../src/wyoming.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "signalk-piper",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Piper text-to-speech as a managed container for Signal K, speaking the Wyoming protocol. Part of the signalk-wyoming voice assistant family.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
6
8
|
"files": [
|
|
7
|
-
"
|
|
9
|
+
"dist",
|
|
10
|
+
"public",
|
|
8
11
|
"README.md",
|
|
9
12
|
"LICENSE"
|
|
10
13
|
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc && webpack",
|
|
16
|
+
"test": "npm run typecheck:test && vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"typecheck:test": "tsc --noEmit --project tsconfig.test.json",
|
|
20
|
+
"prettier": "prettier --write .",
|
|
21
|
+
"lint": "eslint --fix",
|
|
22
|
+
"format": "npm run prettier && npm run lint",
|
|
23
|
+
"ci-lint": "eslint && prettier --check .",
|
|
24
|
+
"prepare": "husky || true",
|
|
25
|
+
"release": "git tag -d v$npm_package_version; git tag v$npm_package_version && git push && git push origin v$npm_package_version",
|
|
26
|
+
"prepublishOnly": "npm run build && npm test"
|
|
27
|
+
},
|
|
28
|
+
"lint-staged": {
|
|
29
|
+
"*.{ts,jsx}": [
|
|
30
|
+
"eslint --fix",
|
|
31
|
+
"prettier --write"
|
|
32
|
+
],
|
|
33
|
+
"*.{js,json,md,yml,css,html}": "prettier --write"
|
|
34
|
+
},
|
|
11
35
|
"keywords": [
|
|
36
|
+
"signalk-node-server-plugin",
|
|
37
|
+
"signalk-plugin-configurator",
|
|
38
|
+
"signalk-category-utility",
|
|
12
39
|
"wyoming",
|
|
13
40
|
"piper",
|
|
14
41
|
"text-to-speech",
|
|
@@ -22,7 +49,38 @@
|
|
|
22
49
|
"type": "git",
|
|
23
50
|
"url": "git+https://github.com/hoeken/signalk-piper.git"
|
|
24
51
|
},
|
|
52
|
+
"signalk": {
|
|
53
|
+
"displayName": "Piper TTS (Wyoming)",
|
|
54
|
+
"requires": [
|
|
55
|
+
"signalk-container"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
25
58
|
"engines": {
|
|
26
|
-
"node": ">=
|
|
59
|
+
"node": ">=24"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"signalk-container-helper": "^0.2.0"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@babel/core": "^7.29.0",
|
|
66
|
+
"@babel/preset-react": "^7.28.5",
|
|
67
|
+
"@eslint/js": "^10.0.1",
|
|
68
|
+
"@signalk/server-api": "^2.30.0",
|
|
69
|
+
"@types/node": "^24.0.0",
|
|
70
|
+
"babel-loader": "^10.1.1",
|
|
71
|
+
"eslint": "^10.2.0",
|
|
72
|
+
"eslint-config-prettier": "^10.1.8",
|
|
73
|
+
"globals": "^17.4.0",
|
|
74
|
+
"husky": "^9.1.7",
|
|
75
|
+
"lint-staged": "^16.4.0",
|
|
76
|
+
"prettier": "^3.8.1",
|
|
77
|
+
"react": "^19.2.4",
|
|
78
|
+
"react-dom": "^19.2.4",
|
|
79
|
+
"signalk-wyoming": "^0.1.0",
|
|
80
|
+
"typescript": "^5.5.0",
|
|
81
|
+
"typescript-eslint": "^8.58.0",
|
|
82
|
+
"vitest": "^4.1.10",
|
|
83
|
+
"webpack": "^5.105.4",
|
|
84
|
+
"webpack-cli": "^7.0.2"
|
|
27
85
|
}
|
|
28
86
|
}
|
package/public/172.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const __webpack_esm_id__=172;export const __webpack_esm_ids__=[172];export const __webpack_esm_modules__={172(e,t,n){n.d(t,{default:()=>E}),n.r(t);var r=n(231);function a(e,t={}){const{stableCount:n=5,preCount:r=3}=t,a=e.filter(e=>"number"==typeof e.pr),o=e.filter(e=>"number"!=typeof e.pr);return{prVersions:a,stableVersions:o.filter(e=>!e.prerelease).slice(0,n),preVersions:o.filter(e=>e.prerelease).slice(0,r)}}const o={root:{fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',color:"#333",padding:"16px 0"},sectionTitle:{fontSize:13,fontWeight:600,color:"#888",textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:10,marginTop:24},btn:{display:"inline-flex",alignItems:"center",gap:8,padding:"8px 16px",border:"none",borderRadius:6,fontSize:13,fontWeight:600,cursor:"pointer"},btnPrimary:{background:"#3b82f6",color:"#fff"},btnSecondary:{background:"#f1f5f9",color:"#475569",border:"1px solid #e2e8f0"},btnWarn:{background:"#f59e0b",color:"#fff"},btnDanger:{background:"#ef4444",color:"#fff"},btnDisabled:{opacity:.5,cursor:"not-allowed"},btnSmall:{padding:"4px 12px",fontSize:12},status:{marginTop:8,fontSize:12,minHeight:18},card:{display:"flex",alignItems:"center",gap:14,padding:"14px 18px",background:"#f8f9fa",border:"1px solid #e0e0e0",borderRadius:10,marginBottom:12},cardIcon:{width:44,height:44,borderRadius:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:20,fontWeight:700,flexShrink:0},cardInfo:{flex:1},cardTitle:{fontSize:15,fontWeight:600,color:"#333"},cardMeta:{fontSize:12,color:"#888"},stateIndicator:{width:10,height:10,borderRadius:"50%",flexShrink:0},fieldRow:{display:"flex",alignItems:"center",gap:12,marginBottom:10},label:{fontSize:13,fontWeight:500,color:"#555",width:180,flexShrink:0},select:{padding:"6px 10px",borderRadius:6,border:"1px solid #ccc",fontSize:13,background:"#fff",color:"#333",minWidth:200},input:{padding:"6px 10px",borderRadius:6,border:"1px solid #ccc",fontSize:13,background:"#fff",color:"#333",width:200},inputSmall:{padding:"6px 10px",borderRadius:6,border:"1px solid #ccc",fontSize:13,background:"#fff",color:"#333",width:80},checkbox:{width:16,height:16,accentColor:"#3b82f6"},hint:{fontSize:11,color:"#aaa",marginLeft:8},link:{color:"#3b82f6",textDecoration:"none",fontSize:13,fontWeight:600},textarea:{padding:"6px 10px",borderRadius:6,border:"1px solid #ccc",fontSize:13,fontFamily:"monospace",background:"#fff",color:"#333",width:"100%",minHeight:70,boxSizing:"border-box",resize:"vertical"},empty:{textAlign:"center",padding:"30px 16px",color:"#999",fontSize:13},tag:{display:"inline-block",padding:"2px 8px",borderRadius:4,fontSize:10,fontWeight:600,marginLeft:8},tagPre:{background:"#fef3c7",color:"#92400e"},tagLatest:{background:"#dcfce7",color:"#166534"},warnBanner:{padding:"12px 16px",background:"#fef2f2",border:"1px solid #fecaca",borderRadius:10,marginBottom:12,fontSize:13,color:"#991b1b",lineHeight:1.5},warnBannerTitle:{fontWeight:700,marginBottom:4},infoBanner:{padding:"12px 16px",background:"#fffbeb",border:"1px solid #fde68a",borderRadius:10,marginBottom:12,fontSize:13,color:"#92400e",lineHeight:1.5},bannerCode:{display:"block",marginTop:8,padding:"8px 10px",background:"#fff",border:"1px solid #fecaca",borderRadius:6,fontFamily:"monospace",fontSize:12,color:"#7f1d1d",whiteSpace:"pre-wrap",wordBreak:"break-word"},statsGrid:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(140px, 1fr))",gap:10,marginBottom:12},statCard:{padding:"12px 16px",background:"#f8f9fa",border:"1px solid #e0e0e0",borderRadius:10,textAlign:"center"},statValue:{fontSize:22,fontWeight:700,color:"#333"},statLabel:{fontSize:11,color:"#888",marginTop:2}},l={ok:"#10b981",warn:"#f59e0b",error:"#ef4444"};function i(e){const{runningTag:t,tagKind:n,currentVersion:r,latestVersion:a,updateAvailable:o,reason:l,fromCache:i,lastSuccessfulCheckAt:s}=e??{};return"offline"===l?i&&s?`Offline — last checked ${function(e){try{const t=new Date(e).getTime(),n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<5)return"just now";if(n<60)return`${n}s ago`;const r=Math.floor(n/60);if(r<60)return`${r}m ago`;const a=Math.floor(r/60);return a<24?`${a}h ago`:`${Math.floor(a/24)}d ago`}catch{return e}}(s)}: ${o?"update available":"up to date"}`:"Offline — never checked yet":"newer-version"===l?`Update available: ${r} → ${a}`:"digest-drift"===l?`Image rebuild available for :${t}${a?` (latest stable: ${a})`:""}`:"up-to-date"===l?"floating"===n&&a?`Up to date with :${t} (latest stable: ${a})`:`Up to date (${r||t})`:"older-than-pinned"===l?`Pinned to ${r}; latest stable is ${a}`:"error"===l?`Check error: ${e?.error||"unknown"}`:`State: ${l||"unknown"}`}function s({children:e}){return r.createElement("div",{style:o.sectionTitle},e)}function c({children:e,color:t}){return r.createElement("span",{style:{...o.hint,...t?{color:t}:{}}},e)}function d({label:e,hint:t,hintColor:n,children:a}){return r.createElement("div",{style:o.fieldRow},r.createElement("span",{style:o.label},e),a,null!=t&&""!==t&&r.createElement(c,{color:n},t))}function u({state:e="ok",color:t,title:n,style:a}){return r.createElement("div",{style:{...o.stateIndicator,background:t??l[e],...a},title:n})}function p({icon:e,iconBackground:t,iconColor:n,title:a,meta:i,state:s="ok",stateTitle:c,link:d,children:p}){const f="error"===s&&!t;return r.createElement("div",{style:o.card},r.createElement("div",{style:{...o.cardIcon,background:f?"#fef2f2":t??"#3b82f6",color:f?l.error:n??"#fff"}},e),r.createElement("div",{style:o.cardInfo},r.createElement("div",{style:o.cardTitle},a),null!=i&&r.createElement("div",{style:o.cardMeta},i)),p,d&&r.createElement("a",{href:d.href,target:"_blank",rel:"noopener noreferrer",style:o.link},d.label),r.createElement(u,{state:s,title:c}))}function f({title:e,defaultOpen:t=!1,children:n}){const[a,l]=(0,r.useState)(t);return r.createElement("div",null,r.createElement("button",{type:"button","aria-expanded":a,style:{...o.sectionTitle,cursor:"pointer",userSelect:"none",display:"flex",alignItems:"center",gap:6,width:"100%",textAlign:"left",background:"none",border:"none",padding:0},onClick:()=>l(!a)},r.createElement("span",{style:{fontSize:10,transition:"transform 0.15s",transform:a?"rotate(90deg)":"rotate(0deg)"}},"▶"),e),a&&r.createElement("div",{style:{marginBottom:16}},n))}const g={primary:o.btnPrimary,secondary:o.btnSecondary,warn:o.btnWarn,danger:o.btnDanger};function m({variant:e="primary",small:t=!1,busy:n=!1,busyLabel:a,disabled:l=!1,onClick:i,title:s,style:c,children:d}){const u=l||n;return r.createElement("button",{type:"button",style:{...o.btn,...g[e],...t?o.btnSmall:{},...u?o.btnDisabled:{},...c},onClick:i,disabled:u,title:s},n?a??d:d)}function b({message:e,error:t=!1,style:n}){return e?r.createElement("div",{style:{...o.status,color:t?l.error:l.ok,marginTop:16,...n}},e):null}const h=[{tag:"latest",label:"latest (recommended)"}];function y({value:e,onChange:t,versions:n,floatingOptions:i=h,stableCount:s,preCount:d,loading:u=!1,error:p,onRefresh:f,disabled:g=!1,style:b}){const y={stableCount:s,preCount:d},{prVersions:v,stableVersions:k,preVersions:S}=a(n,y),E=function(e,t,n=["latest"],r={}){return e?function(e,t=["latest"],n={}){const{prVersions:r,stableVersions:o,preVersions:l}=a(e,n);return new Set([...t,...l.map(e=>e.tag),...o.map(e=>e.tag),...r.map(e=>e.tag)])}(t,n,r).has(e)?null:e:null}(e,n,i.map(e=>e.tag),y);return r.createElement(r.Fragment,null,r.createElement("select",{style:{...o.select,...b},value:e,onChange:e=>t(e.target.value),disabled:g},i.map(e=>r.createElement("option",{key:e.tag,value:e.tag},e.label??e.tag)),S.map(e=>r.createElement("option",{key:e.tag,value:e.tag},e.tag," (pre-release)")),k.map((e,t)=>r.createElement("option",{key:e.tag,value:e.tag},e.tag,0===t?" (current stable)":"")),v.length>0&&r.createElement("optgroup",{label:"PR test images"},v.map(e=>r.createElement("option",{key:e.tag,value:e.tag},e.tag,e.title?` — ${e.title}`:""))),E&&r.createElement("option",{value:E},E," (running)")),u&&r.createElement(c,null,"loading releases..."),f&&r.createElement(m,{small:!0,style:{padding:"4px 10px",fontSize:11},onClick:f,title:"Refresh available versions"},"↻"),p&&r.createElement(c,{color:l.error},p))}function v({checkUrl:e,applyUrl:t,tag:n,onApplied:a,updateLabel:o="Update",disabled:s=!1,style:c}){const d=function(e){const{checkUrl:t,applyUrl:n}=e,[a,o]=(0,r.useState)(!1),[l,i]=(0,r.useState)(!1),[s,c]=(0,r.useState)(null),[d,u]=(0,r.useState)("");return{checking:a,applying:l,result:s,error:d,check:(0,r.useCallback)(async()=>{o(!0),u("");try{const e=await fetch(t),n=await e.json().catch(()=>null);if(e.ok&&n&&"object"==typeof n)c(n);else{const t=n?.error??`HTTP ${e.status}`;u(`Check failed: ${t}`)}}catch(e){u(`Check failed: ${e instanceof Error?e.message:String(e)}`)}o(!1)},[t]),apply:(0,r.useCallback)(async e=>{let t;i(!0),u("");try{const r=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e?{tag:e}:{})}),a=await r.json().catch(()=>null);r.ok?(t={ok:!0,tag:a?.tag},c(null)):(t={ok:!1,error:a?.error??`HTTP ${r.status}`},u(`Update failed: ${t.error}`))}catch(e){t={ok:!1,error:e instanceof Error?e.message:String(e)},u(`Update failed: ${t.error}`)}return i(!1),t},[n])}}({checkUrl:e,applyUrl:t}),[u,p]=(0,r.useState)("");return r.createElement("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:12,...c}},d.result?.updateAvailable?r.createElement(r.Fragment,null,r.createElement("span",{style:{fontSize:13}},i(d.result)),r.createElement(m,{small:!0,variant:"warn",busy:d.applying,busyLabel:"Updating...",disabled:s||d.checking,onClick:()=>{(async()=>{p("");const e=await d.apply(n);e.ok&&(p(e.tag?`Updated to ${e.tag}.`:"Updated."),a?.(e.tag))})()},title:"Pull the image and recreate the container"},o)):d.result?r.createElement("span",{style:{fontSize:12,color:"#888"}},i(d.result)):r.createElement(m,{small:!0,variant:"secondary",busy:d.checking,busyLabel:"Checking...",disabled:s||d.applying,onClick:()=>{d.check()}},"Check for updates"),u&&r.createElement("span",{style:{fontSize:12,color:l.ok}},u),d.error&&r.createElement("span",{style:{fontSize:12,color:l.error}},d.error))}const k="/plugins/signalk-piper",S="en_US-lessac-medium";function E({configuration:e,save:t}){const n=e||{},a=n.advanced||{},[i,c]=(0,r.useState)(n.voice||S),[u,g]=(0,r.useState)(n.imageTag||"auto"),[h,E]=(0,r.useState)(String(n.port??10200)),[x,w]=(0,r.useState)("0.0.0.0"===a.bind?"0.0.0.0":"127.0.0.1"),[C,$]=(0,r.useState)(a.memoryLimit||"512m"),[z,T]=(0,r.useState)(a.restartPolicy||"unless-stopped"),[R,_]=(0,r.useState)(!0===a.updateVoices),[A,U]=(0,r.useState)("number"==typeof a.sentenceSilence?String(a.sentenceSilence):""),[B,I]=(0,r.useState)("number"==typeof a.lengthScale?String(a.lengthScale):""),[P,W]=(0,r.useState)(""),{status:V,loading:H,refresh:L}=function(e,t={}){const{intervalMs:n=5e3}=t,[a,o]=(0,r.useState)(null),[l,i]=(0,r.useState)(!0),s=(0,r.useRef)(0),c=(0,r.useRef)(t.fallback??null),d=(0,r.useCallback)(async t=>{const n=++s.current;let r=c.current;try{const n=await fetch(e,{signal:t}),a=await n.json().catch(()=>null);a&&"object"==typeof a&&(r=a)}catch{}n===s.current&&(o(r),i(!1))},[e]);return(0,r.useEffect)(()=>{let e=!1,t=null;const r=new AbortController,a=async()=>{await d(r.signal),!e&&n>0&&(t=setTimeout(a,n))};return a(),()=>{e=!0,r.abort(),t&&clearTimeout(t)}},[d,n]),{status:a,loading:l,refresh:()=>d()}}(`${k}/api/status`,{fallback:{status:"not_running"}}),M=function(e){const[t,n]=(0,r.useState)([]),[a,o]=(0,r.useState)(""),[l,i]=(0,r.useState)(!1),s=(0,r.useRef)(0),c=(0,r.useCallback)(async()=>{const t=++s.current;i(!0);try{const r=await fetch(e),a=await r.json().catch(()=>null),l=function(e,t){if(!e)return{versions:null,versionsError:"⚠ Could not reach GitHub — showing last known versions, retry"};const n=t&&"object"==typeof t?t:{},r=Array.isArray(n)?n:Array.isArray(n.versions)?n.versions:[],a=!Array.isArray(n)&&n.sources&&"object"==typeof n.sources?n.sources:{};let o="";return"rate-limited"===a.prImages?o="⚠ GitHub rate-limited — PR test images temporarily unavailable, retry shortly":"rate-limited"===a.releases?o="⚠ GitHub rate-limited — some versions temporarily unavailable, retry shortly":"error"!==a.prImages&&"error"!==a.releases||(o="⚠ Could not fetch some versions from GitHub, retry"),{versions:r,versionsError:o}}(r.ok,a);if(t!==s.current)return;null!==l.versions&&n(l.versions),o(l.versionsError)}catch{if(t!==s.current)return;o("⚠ Offline — showing last known versions")}i(!1)},[e]);return(0,r.useEffect)(()=>{c()},[c]),{versions:t,versionsError:a,loading:l,refresh:c}}(`${k}/api/versions`),j=V&&"string"==typeof V.status?V.status:"not_running",N="ready"===j?"ok":"starting"===j?"warn":"error",F=function(e){if(!e||!Array.isArray(e.tts))return null;let t=0;for(const n of e.tts)n&&Array.isArray(n.voices)&&(t+=n.voices.length);return t}(V&&V.info),O=H?"Checking...":"ready"===j?`rhasspy/wyoming-piper:${V.tag} at ${V.uri}`+(F?` — ${F} voice${1===F?"":"s"}`:""):"starting"===j?"Starting — a first start downloads the voice (~60 MB)":"error"===j?"Not answering"+(V&&V.uri?` at ${V.uri}`:""):"Not running",D=function(e){return e.endsWith("-low")||e.endsWith("-x_low")}(i);return r.createElement("div",{style:o.root},r.createElement(s,null,"Piper status"),r.createElement(p,{icon:"P",iconBackground:"ready"===j?"#7c3aed":void 0,title:"Piper TTS (Wyoming)",meta:O,state:N,stateTitle:j}),"not_running"!==j&&"stopped"!==j&&r.createElement(v,{checkUrl:`${k}/api/update/check`,applyUrl:`${k}/api/update/apply`,tag:u,onApplied:()=>{L()}}),r.createElement(s,null,"Settings"),r.createElement(d,{label:"Voice",hint:D?`${i} is a 16 kHz voice — use -medium or -high (22.05 kHz)`:"22.05 kHz voices only (-medium / -high); ~60 MB download on first start",hintColor:D?l.warn:void 0},r.createElement("input",{style:{...o.input,width:220},value:i,onChange:e=>c(e.target.value),placeholder:S})),r.createElement(d,{label:"Image version"},r.createElement(y,{value:u,onChange:g,versions:M.versions,floatingOptions:[{tag:"auto",label:"auto (pinned release, recommended)"}],loading:M.loading,error:M.versionsError,onRefresh:M.refresh})),r.createElement(d,{label:"Port",hint:"leave at 10200 unless it collides"},r.createElement("input",{style:{...o.input,width:90},type:"number",value:h,onChange:e=>E(e.target.value)})),r.createElement(f,{title:"Advanced"},r.createElement(d,{label:"Bind address",hint:"0.0.0.0"===x?"LAN-reachable — Wyoming has no authentication, firewall accordingly":"only Signal K can reach the service",hintColor:"0.0.0.0"===x?l.warn:void 0},r.createElement("select",{style:o.select,value:x,onChange:e=>w(e.target.value)},r.createElement("option",{value:"127.0.0.1"},"127.0.0.1 (recommended)"),r.createElement("option",{value:"0.0.0.0"},"0.0.0.0 (all interfaces)"))),r.createElement(d,{label:"Memory limit",hint:'hard cap, e.g. "512m" or "1g"'},r.createElement("input",{style:{...o.input,width:90},value:C,onChange:e=>$(e.target.value)})),r.createElement(d,{label:"Restart policy"},r.createElement("select",{style:o.select,value:z,onChange:e=>T(e.target.value)},r.createElement("option",{value:"unless-stopped"},"unless-stopped"),r.createElement("option",{value:"always"},"always"),r.createElement("option",{value:"no"},"no"))),r.createElement(d,{label:"Update voices list",hint:"fetch the latest voices catalog at container start (needs internet)"},r.createElement("input",{style:o.checkbox,type:"checkbox",checked:R,onChange:e=>_(e.target.checked)})),r.createElement(d,{label:"Sentence silence",hint:"optional seconds of silence after each sentence"},r.createElement("input",{style:{...o.input,width:90},type:"number",step:"0.1",value:A,onChange:e=>U(e.target.value)})),r.createElement(d,{label:"Length scale",hint:"optional; above 1 slows speech down"},r.createElement("input",{style:{...o.input,width:90},type:"number",step:"0.1",value:B,onChange:e=>I(e.target.value)}))),r.createElement("div",{style:{marginTop:24}},r.createElement(m,{onClick:()=>{const e={bind:x,memoryLimit:C,restartPolicy:z,updateVoices:R},r=Number(A);""!==A&&Number.isFinite(r)&&(e.sentenceSilence=r);const a=Number(B);""!==B&&Number.isFinite(a)&&(e.lengthScale=a);const o=Number(h);t({...n,voice:i,imageTag:u,port:""!==h&&Number.isFinite(o)?o:10200,advanced:e}),W("Saved. Signal K restarts the plugin with the new configuration.")}},"Save Configuration")),r.createElement(b,{message:P}))}}};
|
package/public/540.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! For license information please see 540.mjs.LICENSE.txt */
|
|
2
|
+
export const __webpack_esm_id__=540;export const __webpack_esm_ids__=[540];export const __webpack_esm_modules__={869(e,t){var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),i=Symbol.for("react.context"),a=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),l=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),d=Symbol.iterator,_={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,m={};function b(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||_}function v(){}function S(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||_}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=b.prototype;var E=S.prototype=new v;E.constructor=S,h(E,b.prototype),E.isPureReactComponent=!0;var w=Array.isArray;function g(){}var k={H:null,A:null,T:null,S:null},H=Object.prototype.hasOwnProperty;function j(e,t,r){var o=r.ref;return{$$typeof:n,type:e,key:t,ref:void 0!==o?o:null,props:r}}function R(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var C=/\/+/g;function $(e,t){return"object"==typeof e&&null!==e&&null!=e.key?(n=""+e.key,r={"=":"=0",":":"=2"},"$"+n.replace(/[=:]/g,function(e){return r[e]})):t.toString(36);var n,r}function x(e,t,o,u,c){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var i,a,f=!1;if(null===e)f=!0;else switch(s){case"bigint":case"string":case"number":f=!0;break;case"object":switch(e.$$typeof){case n:case r:f=!0;break;case p:return x((f=e._init)(e._payload),t,o,u,c)}}if(f)return c=c(e),f=""===u?"."+$(e,0):u,w(c)?(o="",null!=f&&(o=f.replace(C,"$&/")+"/"),x(c,t,o,"",function(e){return e})):null!=c&&(R(c)&&(i=c,a=o+(null==c.key||e&&e.key===c.key?"":(""+c.key).replace(C,"$&/")+"/")+f,c=j(i.type,a,i.props)),t.push(c)),1;f=0;var l,y=""===u?".":u+":";if(w(e))for(var _=0;_<e.length;_++)f+=x(u=e[_],t,o,s=y+$(u,_),c);else if("function"==typeof(_=null===(l=e)||"object"!=typeof l?null:"function"==typeof(l=d&&l[d]||l["@@iterator"])?l:null))for(e=_.call(e),_=0;!(u=e.next()).done;)f+=x(u=u.value,t,o,s=y+$(u,_++),c);else if("object"===s){if("function"==typeof e.then)return x(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"==typeof e.status?e.then(g,g):(e.status="pending",e.then(function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)},function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(e),t,o,u,c);throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.")}return f}function T(e,t,n){if(null==e)return e;var r=[],o=0;return x(e,r,"","",function(e){return t.call(n,e,o++)}),r}function A(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var O="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)},I={map:T,forEach:function(e,t,n){T(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return T(e,function(){t++}),t},toArray:function(e){return T(e,function(e){return e})||[]},only:function(e){if(!R(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};t.Activity=y,t.Children=I,t.Component=b,t.Fragment=o,t.Profiler=c,t.PureComponent=S,t.StrictMode=u,t.Suspense=f,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=k,t.__COMPILER_RUNTIME={__proto__:null,c:function(e){return k.H.useMemoCache(e)}},t.cache=function(e){return function(){return e.apply(null,arguments)}},t.cacheSignal=function(){return null},t.cloneElement=function(e,t,n){if(null==e)throw Error("The argument must be a React element, but you passed "+e+".");var r=h({},e.props),o=e.key;if(null!=t)for(u in void 0!==t.key&&(o=""+t.key),t)!H.call(t,u)||"key"===u||"__self"===u||"__source"===u||"ref"===u&&void 0===t.ref||(r[u]=t[u]);var u=arguments.length-2;if(1===u)r.children=n;else if(1<u){for(var c=Array(u),s=0;s<u;s++)c[s]=arguments[s+2];r.children=c}return j(e.type,o,r)},t.createContext=function(e){return(e={$$typeof:i,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:s,_context:e},e},t.createElement=function(e,t,n){var r,o={},u=null;if(null!=t)for(r in void 0!==t.key&&(u=""+t.key),t)H.call(t,r)&&"key"!==r&&"__self"!==r&&"__source"!==r&&(o[r]=t[r]);var c=arguments.length-2;if(1===c)o.children=n;else if(1<c){for(var s=Array(c),i=0;i<c;i++)s[i]=arguments[i+2];o.children=s}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===o[r]&&(o[r]=c[r]);return j(e,u,o)},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:a,render:e}},t.isValidElement=R,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:A}},t.memo=function(e,t){return{$$typeof:l,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=k.T,n={};k.T=n;try{var r=e(),o=k.S;null!==o&&o(n,r),"object"==typeof r&&null!==r&&"function"==typeof r.then&&r.then(g,O)}catch(e){O(e)}finally{null!==t&&null!==n.types&&(t.types=n.types),k.T=t}},t.unstable_useCacheRefresh=function(){return k.H.useCacheRefresh()},t.use=function(e){return k.H.use(e)},t.useActionState=function(e,t,n){return k.H.useActionState(e,t,n)},t.useCallback=function(e,t){return k.H.useCallback(e,t)},t.useContext=function(e){return k.H.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e,t){return k.H.useDeferredValue(e,t)},t.useEffect=function(e,t){return k.H.useEffect(e,t)},t.useEffectEvent=function(e){return k.H.useEffectEvent(e)},t.useId=function(){return k.H.useId()},t.useImperativeHandle=function(e,t,n){return k.H.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return k.H.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return k.H.useLayoutEffect(e,t)},t.useMemo=function(e,t){return k.H.useMemo(e,t)},t.useOptimistic=function(e,t){return k.H.useOptimistic(e,t)},t.useReducer=function(e,t,n){return k.H.useReducer(e,t,n)},t.useRef=function(e){return k.H.useRef(e)},t.useState=function(e){return k.H.useState(e)},t.useSyncExternalStore=function(e,t,n){return k.H.useSyncExternalStore(e,t,n)},t.useTransition=function(){return k.H.useTransition()},t.version="19.2.8"},540(e,t,n){e.exports=n(869)}};
|
package/public/main.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={980(){}};const t={};function r(o){const s=t[o];if(void 0!==s)return s.exports;const n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}r.m=e,r.c=t,r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>e+".mjs",r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{r.S={};const e={},t={};r.I=(o,s)=>{s||(s=[]);let n=t[o];if(n||(n=t[o]={}),s.indexOf(n)>=0)return;if(s.push(n),e[o])return e[o];r.o(r.S,o)||(r.S[o]={});const i=r.S[o],c="signalk-piper",_=[];return"default"===o&&((e,t,o,s)=>{const n=i[e]=i[e]||{},_=n[t];(!_||!_.loaded&&(1!=!_.eager?s:c>_.from))&&(n[t]={get:()=>r.e(540).then(()=>()=>r(540)),from:c,eager:!1})})("react","19.2.8"),e[o]=_.length?Promise.all(_).then(()=>e[o]=1):1}})(),(()=>{const e={792:0},t=t=>{let{__webpack_esm_ids__:o,__webpack_esm_modules__:s,__webpack_esm_runtime__:n}=t;var i,c,_=0;for(i in s)r.o(s,i)&&(r.m[i]=s[i]);for(n&&n(r);_<o.length;_++)c=o[_],r.o(e,c)&&e[c]&&e[c][0](),e[o[_]]=0};r.f.j=(o,s)=>{let n=r.o(e,o)?e[o]:void 0;if(0!==n)if(n)s.push(n[1]);else{let i=import("./"+r.u(o)).then(t,t=>{throw 0!==e[o]&&(e[o]=void 0),t});i=Promise.race([i,new Promise(t=>n=e[o]=[t])]),s.push(n[1]=i)}}})(),r(980);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={623(e,r,t){const n={"./PluginConfigurationPanel":()=>t.e(172).then(()=>()=>t(172))},o=(e,r)=>(t.R=r,r=t.o(n,e)?n[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),t.R=void 0,r),i=(e,r)=>{if(!t.S)return;const n="default",o=t.S[n];if(o&&o!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[n]=e,t.I(n,r)};t.d(r,{get:()=>o,init:()=>i})}};const r={};function t(n){const o=r[n];if(void 0!==o)return o.exports;const i=r[n]={exports:{}};return e[n](i,i.exports,t),i.exports}t.m=e,t.c=r,t.d=(e,r)=>{if(Array.isArray(r))for(var n=0;n<r.length;){var o=r[n++],i=r[n++];t.o(e,o)?0===i&&n++:0===i?Object.defineProperty(e,o,{enumerable:!0,value:r[n++]}):Object.defineProperty(e,o,{enumerable:!0,get:i})}else for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce((r,n)=>(t.f[n](e,r),r),[])),t.u=e=>e+".mjs",t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{t.S={};const e={},r={};t.I=(n,o)=>{o||(o=[]);let i=r[n];if(i||(i=r[n]={}),o.indexOf(i)>=0)return;if(o.push(i),e[n])return e[n];t.o(t.S,n)||(t.S[n]={});const s=t.S[n],a="signalk-piper",u=[];return"default"===n&&((e,r,n,o)=>{const i=s[e]=s[e]||{},u=i[r];(!u||!u.loaded&&(1!=!u.eager?o:a>u.from))&&(i[r]={get:()=>t.e(540).then(()=>()=>t(540)),from:a,eager:!1})})("react","19.2.8"),e[n]=u.length?Promise.all(u).then(()=>e[n]=1):1}})(),(()=>{var e=e=>{var r=e=>e.split(".").map(e=>+e==e?+e:e),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=t[1]?r(t[1]):[];return t[2]&&(n.length++,n.push.apply(n,r(t[2]))),t[3]&&(n.push([]),n.push.apply(n,r(t[3]))),n},r=e=>{var t=e[0],n="";if(1===e.length)return"*";if(t+.5){n+=0==t?">=":-1==t?"<":1==t?"^":2==t?"~":t>0?"=":"!=";for(var o=1,i=1;i<e.length;i++)o--,n+="u"==(typeof(a=e[i]))[0]?"-":(o>0?".":"")+(o=2,a);return n}var s=[];for(i=1;i<e.length;i++){var a=e[i];s.push(0===a?"not("+u()+")":1===a?"("+u()+" || "+u()+")":2===a?s.pop()+" "+s.pop():r(a))}return u();function u(){return s.pop().replace(/^\((.+)\)$/,"$1")}},n=(r,t)=>{if(0 in r){t=e(t);var o=r[0],i=o<0;i&&(o=-o-1);for(var s=0,a=1,u=!0;;a++,s++){var f,l,c=a<r.length?(typeof r[a])[0]:"";if(s>=t.length||"o"==(l=(typeof(f=t[s]))[0]))return!u||("u"==c?a>o&&!i:""==c!=i);if("u"==l){if(!u||"u"!=c)return!1}else if(u)if(c==l)if(a<=o){if(f!=r[a])return!1}else{if(i?f>r[a]:f<r[a])return!1;f!=r[a]&&(u=!1)}else if("s"!=c&&"n"!=c){if(i||a<=o)return!1;u=!1,a--}else{if(a<=o||l<c!=i)return!1;u=!1}else"s"!=c&&"n"!=c&&(u=!1,a--)}}var p=[],d=p.pop.bind(p);for(s=1;s<r.length;s++){var h=r[s];p.push(1==h?d()|d():2==h?d()&d():h?n(h,t):!d())}return!!d()};const o=(r,t,n)=>{const o=n?(e=>Object.keys(e).reduce((r,t)=>(e[t].eager&&(r[t]=e[t]),r),{}))(r[t]):r[t];return Object.keys(o).reduce((r,t)=>!r||!o[r].loaded&&((r,t)=>{r=e(r),t=e(t);for(var n=0;;){if(n>=r.length)return n<t.length&&"u"!=(typeof t[n])[0];var o=r[n],i=(typeof o)[0];if(n>=t.length)return"u"==i;var s=t[n],a=(typeof s)[0];if(i!=a)return"o"==i&&"n"==a||"s"==a||"u"==i;if("o"!=i&&"u"!=i&&o!=s)return o<s;n++}})(r,t)?t:r,0)},i=(e,r,t)=>t?t():((e,r)=>(e=>{throw new Error(e)})("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),s=(e=>function(r,n,o,i,s){const a=t.I(r);return a?.then&&!o?a.then(e.bind(e,r,t.S[r],n,!1,i,s)):e(r,t.S[r],n,o,i,s)})((e,s,a,u,f,l)=>{if(!((e,r)=>e&&t.o(e,r))(s,a))return i(e,a,l);const c=o(s,a,u);return n(f,c)||(d=((e,t,n,o)=>"Unsatisfied version "+n+" from "+(n&&e[t][n].from)+" of shared singleton module "+t+" (required "+r(o)+")")(s,a,c,f),"undefined"!=typeof console&&console.warn&&console.warn(d)),(p=s[a][c]).loaded=1,p.get();var p,d}),a={},u={231:()=>s("default","react",!1,[1,19],()=>t.e(540).then(()=>()=>t(540)))},f={172:[231]},l={};t.f.consumes=(e,r)=>{t.o(f,e)&&f[e].forEach(e=>{if(t.o(a,e))return r.push(a[e]);if(!l[e]){const n=r=>{a[e]=0,t.m[e]=n=>{delete t.c[e],n.exports=r()}};l[e]=!0;const o=r=>{delete a[e],t.m[e]=n=>{throw delete t.c[e],r}};try{const t=u[e]();t.then?r.push(a[e]=t.then(n).catch(o)):n(t)}catch(e){o(e)}}})}})(),(()=>{const e={37:0},r=r=>{let{__webpack_esm_ids__:n,__webpack_esm_modules__:o,__webpack_esm_runtime__:i}=r;var s,a,u=0;for(s in o)t.o(o,s)&&(t.m[s]=o[s]);for(i&&i(t);u<n.length;u++)a=n[u],t.o(e,a)&&e[a]&&e[a][0](),e[n[u]]=0};t.f.j=(n,o)=>{let i=t.o(e,n)?e[n]:void 0;if(0!==i)if(i)o.push(i[1]);else{let s=import("./"+t.u(n)).then(r,r=>{throw 0!==e[n]&&(e[n]=void 0),r});s=Promise.race([s,new Promise(r=>i=e[n]=[r])]),o.push(i[1]=s)}}})();let n=t(623);const o=n.get,i=n.init;export{o as get,i as init};
|
package/index.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module.exports = function (app) {
|
|
2
|
-
const plugin = {
|
|
3
|
-
id: 'signalk-piper',
|
|
4
|
-
name: 'Piper (Wyoming TTS)',
|
|
5
|
-
description:
|
|
6
|
-
'Wyoming Piper text-to-speech service for Signal K — pre-release placeholder, not yet functional.',
|
|
7
|
-
|
|
8
|
-
schema: () => ({
|
|
9
|
-
type: 'object',
|
|
10
|
-
properties: {},
|
|
11
|
-
}),
|
|
12
|
-
|
|
13
|
-
start: (options) => {
|
|
14
|
-
app.setPluginStatus(
|
|
15
|
-
'Pre-release placeholder — not yet functional. See https://github.com/hoeken/signalk-wyoming'
|
|
16
|
-
)
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
stop: () => {},
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return plugin
|
|
23
|
-
}
|