ugly-app 0.1.816 → 0.1.817
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/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/audio/AudioPlayer.d.ts.map +1 -1
- package/dist/client/audio/AudioPlayer.js +10 -3
- package/dist/client/audio/AudioPlayer.js.map +1 -1
- package/dist/client/audio/AudioRecorder.d.ts.map +1 -1
- package/dist/client/audio/AudioRecorder.js +9 -3
- package/dist/client/audio/AudioRecorder.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/client/audio/AudioPlayer.ts +13 -3
- package/src/client/audio/AudioRecorder.ts +11 -3
- package/templates/shared/pages.ts +15 -0
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.817";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioPlayer.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioPlayer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AudioPlayer.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioPlayer.ts"],"names":[],"mappings":"AAsFA,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAS;IAEzB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,WAAW,IAAI,YAAY,GAAG,IAAI;IAIlC,iFAAiF;IACjF,iBAAiB,IAAI,MAAM;IAI3B,0FAA0F;IAC1F,YAAY,IAAI,MAAM;IAItB,uEAAuE;IACvE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,iDAAiD;IACjD,KAAK,IAAI,IAAI;IAOb;;;;;;;;OAQG;IACH,MAAM,IAAI,IAAI;IAed,OAAO,CAAC,WAAW;IAWb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B3B,2EAA2E;IACrE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAUvB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD,IAAI,IAAI,IAAI;IAKN,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|
|
@@ -61,8 +61,15 @@ registerProcessor('pcm16-player', PCM16Player);
|
|
|
61
61
|
`;
|
|
62
62
|
/** TTS audio is always mono PCM16 @ 24 kHz (see TTSChunkMsg). */
|
|
63
63
|
const TTS_SAMPLE_RATE = 24000;
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
// Built on first use, never at import time. `Blob`/`URL.createObjectURL` are
|
|
65
|
+
// browser-only, and this module is reachable from a server-rendered page's
|
|
66
|
+
// import graph: evaluating them at module scope makes the Cloudflare Worker
|
|
67
|
+
// bundle fail to deploy with "URL.createObjectURL() is not implemented".
|
|
68
|
+
let workletUrl = null;
|
|
69
|
+
function getWorkletUrl() {
|
|
70
|
+
workletUrl ??= URL.createObjectURL(new Blob([WORKLET_CODE], { type: 'application/javascript' }));
|
|
71
|
+
return workletUrl;
|
|
72
|
+
}
|
|
66
73
|
function pcm16ToFloat32(buffer) {
|
|
67
74
|
const int16 = new Int16Array(buffer);
|
|
68
75
|
const float32 = new Float32Array(int16.length);
|
|
@@ -152,7 +159,7 @@ export class AudioPlayer {
|
|
|
152
159
|
// gesture-granted permission carries over; only create one if absent.
|
|
153
160
|
if (!this.ctx)
|
|
154
161
|
this.ctx = this.makeContext();
|
|
155
|
-
await this.ctx.audioWorklet.addModule(
|
|
162
|
+
await this.ctx.audioWorklet.addModule(getWorkletUrl());
|
|
156
163
|
this.workletNode = new AudioWorkletNode(this.ctx, 'pcm16-player');
|
|
157
164
|
this.workletNode.port.onmessage = (e) => {
|
|
158
165
|
const d = e.data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioPlayer.js","sourceRoot":"","sources":["../../../src/client/audio/AudioPlayer.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DpB,CAAC;AAEF,iEAAiE;AACjE,MAAM,eAAe,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"AudioPlayer.js","sourceRoot":"","sources":["../../../src/client/audio/AudioPlayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"AA2CA,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA2C;IAE1D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DlE,IAAI,IAAI,IAAI;CAYb"}
|
|
@@ -24,8 +24,14 @@ class RecorderProcessor extends AudioWorkletProcessor {
|
|
|
24
24
|
}
|
|
25
25
|
registerProcessor('audio-recorder', RecorderProcessor);
|
|
26
26
|
`;
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
// Lazy for the same reason as AudioPlayer's: `Blob`/`URL.createObjectURL` at
|
|
28
|
+
// module scope break the Cloudflare Worker bundle when a server-rendered page
|
|
29
|
+
// transitively imports this module.
|
|
30
|
+
let workletUrl = null;
|
|
31
|
+
function getWorkletUrl() {
|
|
32
|
+
workletUrl ??= URL.createObjectURL(new Blob([WORKLET_CODE], { type: 'application/javascript' }));
|
|
33
|
+
return workletUrl;
|
|
34
|
+
}
|
|
29
35
|
const TARGET_SAMPLE_RATE = 48000;
|
|
30
36
|
export class AudioRecorder {
|
|
31
37
|
ctx = null;
|
|
@@ -57,7 +63,7 @@ export class AudioRecorder {
|
|
|
57
63
|
this.ctx = new AudioContext({ sampleRate: TARGET_SAMPLE_RATE });
|
|
58
64
|
console.log(`[AudioRecorder] AudioContext state=${this.ctx.state} sampleRate=${this.ctx.sampleRate}`);
|
|
59
65
|
const source = this.ctx.createMediaStreamSource(this.stream);
|
|
60
|
-
await this.ctx.audioWorklet.addModule(
|
|
66
|
+
await this.ctx.audioWorklet.addModule(getWorkletUrl());
|
|
61
67
|
console.log('[AudioRecorder] worklet loaded');
|
|
62
68
|
this.worklet = new AudioWorkletNode(this.ctx, 'audio-recorder');
|
|
63
69
|
let chunkCount = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioRecorder.js","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBpB,CAAC;AACF,
|
|
1
|
+
{"version":3,"file":"AudioRecorder.js","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.817",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
6
6
|
"files": [
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.817";
|
|
@@ -62,8 +62,18 @@ registerProcessor('pcm16-player', PCM16Player);
|
|
|
62
62
|
|
|
63
63
|
/** TTS audio is always mono PCM16 @ 24 kHz (see TTSChunkMsg). */
|
|
64
64
|
const TTS_SAMPLE_RATE = 24000;
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
|
|
66
|
+
// Built on first use, never at import time. `Blob`/`URL.createObjectURL` are
|
|
67
|
+
// browser-only, and this module is reachable from a server-rendered page's
|
|
68
|
+
// import graph: evaluating them at module scope makes the Cloudflare Worker
|
|
69
|
+
// bundle fail to deploy with "URL.createObjectURL() is not implemented".
|
|
70
|
+
let workletUrl: string | null = null;
|
|
71
|
+
function getWorkletUrl(): string {
|
|
72
|
+
workletUrl ??= URL.createObjectURL(
|
|
73
|
+
new Blob([WORKLET_CODE], { type: 'application/javascript' }),
|
|
74
|
+
);
|
|
75
|
+
return workletUrl;
|
|
76
|
+
}
|
|
67
77
|
|
|
68
78
|
function pcm16ToFloat32(buffer: ArrayBuffer): Float32Array {
|
|
69
79
|
const int16 = new Int16Array(buffer);
|
|
@@ -159,7 +169,7 @@ export class AudioPlayer {
|
|
|
159
169
|
// Reuse a context created by an earlier `unlock()` (in the gesture) so the
|
|
160
170
|
// gesture-granted permission carries over; only create one if absent.
|
|
161
171
|
if (!this.ctx) this.ctx = this.makeContext();
|
|
162
|
-
await this.ctx.audioWorklet.addModule(
|
|
172
|
+
await this.ctx.audioWorklet.addModule(getWorkletUrl());
|
|
163
173
|
this.workletNode = new AudioWorkletNode(this.ctx, 'pcm16-player');
|
|
164
174
|
this.workletNode.port.onmessage = (e: MessageEvent) => {
|
|
165
175
|
const d = e.data as { type?: string; played?: number };
|
|
@@ -24,8 +24,16 @@ class RecorderProcessor extends AudioWorkletProcessor {
|
|
|
24
24
|
}
|
|
25
25
|
registerProcessor('audio-recorder', RecorderProcessor);
|
|
26
26
|
`;
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
// Lazy for the same reason as AudioPlayer's: `Blob`/`URL.createObjectURL` at
|
|
28
|
+
// module scope break the Cloudflare Worker bundle when a server-rendered page
|
|
29
|
+
// transitively imports this module.
|
|
30
|
+
let workletUrl: string | null = null;
|
|
31
|
+
function getWorkletUrl(): string {
|
|
32
|
+
workletUrl ??= URL.createObjectURL(
|
|
33
|
+
new Blob([WORKLET_CODE], { type: 'application/javascript' }),
|
|
34
|
+
);
|
|
35
|
+
return workletUrl;
|
|
36
|
+
}
|
|
29
37
|
const TARGET_SAMPLE_RATE = 48000;
|
|
30
38
|
|
|
31
39
|
interface RecorderChunkMessage {
|
|
@@ -68,7 +76,7 @@ export class AudioRecorder {
|
|
|
68
76
|
console.log(`[AudioRecorder] AudioContext state=${this.ctx.state} sampleRate=${this.ctx.sampleRate}`);
|
|
69
77
|
const source = this.ctx.createMediaStreamSource(this.stream);
|
|
70
78
|
|
|
71
|
-
await this.ctx.audioWorklet.addModule(
|
|
79
|
+
await this.ctx.audioWorklet.addModule(getWorkletUrl());
|
|
72
80
|
console.log('[AudioRecorder] worklet loaded');
|
|
73
81
|
this.worklet = new AudioWorkletNode(this.ctx, 'audio-recorder');
|
|
74
82
|
|
|
@@ -4,6 +4,21 @@ import { definePage, definePages } from 'ugly-app/shared';
|
|
|
4
4
|
// Every route your app supports. Each key is a URL path segment; the matching
|
|
5
5
|
// component is wired in client/allPages.ts.
|
|
6
6
|
// definePage<Params>(options) – Params types the URL params (path + query)
|
|
7
|
+
//
|
|
8
|
+
// Server-side rendering (public pages only):
|
|
9
|
+
// ssr: true – render this page in the Worker and edge-cache the result.
|
|
10
|
+
// The document is user-independent (no token, no cookie),
|
|
11
|
+
// so ONE cached entry serves every visitor; the browser
|
|
12
|
+
// resolves its session afterwards via /auth/token.
|
|
13
|
+
// Needs `auth: false`, a component in client/ssrPages.ts,
|
|
14
|
+
// and `cfg.setSSR(createSsrRender({…}))` in server/workers.ts.
|
|
15
|
+
// The Worker has no code splitting: everything an SSR'd
|
|
16
|
+
// page imports is bundled into worker.js.
|
|
17
|
+
// ssrCacheTimeout: N – seconds the edge holds it. Omit for the default (1 year):
|
|
18
|
+
// a deploy changes the buildId and so invalidates every
|
|
19
|
+
// page. Set it only for content that changes BETWEEN deploys.
|
|
20
|
+
// cacheQuery: ['q'] – query params that belong in the cache key. Any other
|
|
21
|
+
// param bypasses the cache entirely.
|
|
7
22
|
export const pages = definePages({
|
|
8
23
|
'': definePage<{}>({ auth: false }),
|
|
9
24
|
// @scaffold:pages
|