ugly-app 0.1.620 → 0.1.621
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/native/contract-meta.d.ts +7 -0
- package/dist/native/contract-meta.d.ts.map +1 -0
- package/dist/native/contract-meta.js +105 -0
- package/dist/native/contract-meta.js.map +1 -0
- package/dist/native/contract.d.ts +254 -24
- package/dist/native/contract.d.ts.map +1 -1
- package/dist/native/contract.js +4 -15
- package/dist/native/contract.js.map +1 -1
- package/dist/native/facades/net.d.ts +26 -0
- package/dist/native/facades/net.d.ts.map +1 -0
- package/dist/native/facades/net.js +22 -0
- package/dist/native/facades/net.js.map +1 -0
- package/dist/native/facades/process.d.ts +20 -0
- package/dist/native/facades/process.d.ts.map +1 -0
- package/dist/native/facades/process.js +15 -0
- package/dist/native/facades/process.js.map +1 -0
- package/dist/native/facades/studio.d.ts +47 -0
- package/dist/native/facades/studio.d.ts.map +1 -0
- package/dist/native/facades/studio.js +38 -0
- package/dist/native/facades/studio.js.map +1 -0
- package/dist/native/index.d.ts +10 -3
- package/dist/native/index.d.ts.map +1 -1
- package/dist/native/index.js +4 -2
- package/dist/native/index.js.map +1 -1
- package/dist/native/install.d.ts.map +1 -1
- package/dist/native/install.js +10 -8
- package/dist/native/install.js.map +1 -1
- package/dist/native/permissions.d.ts +12 -0
- package/dist/native/permissions.d.ts.map +1 -0
- package/dist/native/permissions.js +47 -0
- package/dist/native/permissions.js.map +1 -0
- package/dist/native/protocol.d.ts +5 -1
- package/dist/native/protocol.d.ts.map +1 -1
- package/dist/native/protocol.js +8 -0
- package/dist/native/protocol.js.map +1 -1
- package/dist/native/web-adapter.d.ts +5 -0
- package/dist/native/web-adapter.d.ts.map +1 -0
- package/dist/native/web-adapter.js +111 -0
- package/dist/native/web-adapter.js.map +1 -0
- package/dist/native/wrapper.d.ts +80 -6
- package/dist/native/wrapper.d.ts.map +1 -1
- package/dist/native/wrapper.js +149 -12
- package/dist/native/wrapper.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/native/contract-meta.test.ts +23 -0
- package/src/native/contract-meta.ts +114 -0
- package/src/native/contract.test.ts +13 -7
- package/src/native/contract.ts +130 -32
- package/src/native/facades/facades.test.ts +35 -0
- package/src/native/facades/net.ts +50 -0
- package/src/native/facades/process.ts +37 -0
- package/src/native/facades/studio.ts +73 -0
- package/src/native/index.ts +24 -3
- package/src/native/install.test.ts +8 -0
- package/src/native/install.ts +12 -8
- package/src/native/permissions.test.ts +42 -0
- package/src/native/permissions.ts +53 -0
- package/src/native/protocol.test.ts +15 -0
- package/src/native/protocol.ts +10 -1
- package/src/native/web-adapter.test.ts +27 -0
- package/src/native/web-adapter.ts +118 -0
- package/src/native/wrapper.test.ts +22 -0
- package/src/native/wrapper.ts +163 -13
package/src/native/wrapper.ts
CHANGED
|
@@ -1,28 +1,178 @@
|
|
|
1
|
-
import type { DataOf, PayloadOf } from './contract.js';
|
|
1
|
+
import type { Channel, DataOf, PayloadOf, ResultOf } from './contract.js';
|
|
2
2
|
import type { NativePlatform } from './protocol.js';
|
|
3
|
+
import { NativeUnavailableError } from './protocol.js';
|
|
3
4
|
import { installUglyNative } from './install.js';
|
|
5
|
+
import { createPermissions } from './permissions.js';
|
|
6
|
+
import { createProcessFacade } from './facades/process.js';
|
|
7
|
+
import { createNetFacade } from './facades/net.js';
|
|
8
|
+
import { createStudioFacade } from './facades/studio.js';
|
|
4
9
|
|
|
5
10
|
const n = () => installUglyNative();
|
|
11
|
+
const inv = <C extends Channel>(c: C, p: PayloadOf<C>): Promise<ResultOf<C>> =>
|
|
12
|
+
n().invoke(c, p) as Promise<ResultOf<C>>;
|
|
13
|
+
|
|
14
|
+
export const permissions = createPermissions((c, p) => n().invoke(c as never, p as never), n().platform);
|
|
15
|
+
|
|
16
|
+
// Desktop daemon bridges (process/net/studio + fs bytes) hang off window.UglyDesktop.
|
|
17
|
+
interface DesktopBridges {
|
|
18
|
+
process?: unknown;
|
|
19
|
+
net?: unknown;
|
|
20
|
+
studio?: unknown;
|
|
21
|
+
fsBytes?: {
|
|
22
|
+
readFileBytes(path: string): Promise<Uint8Array>;
|
|
23
|
+
writeFileBytes(path: string, bytes: Uint8Array): Promise<void>;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const desktopBridge = (): DesktopBridges | undefined =>
|
|
27
|
+
(globalThis as unknown as { UglyDesktop?: DesktopBridges }).UglyDesktop;
|
|
6
28
|
|
|
7
29
|
export const native = {
|
|
30
|
+
permissions,
|
|
31
|
+
capture: {
|
|
32
|
+
screenshot: () => inv('capture.screenshot', undefined),
|
|
33
|
+
},
|
|
8
34
|
gps: {
|
|
9
|
-
start: (p: PayloadOf<'gps.start'>) =>
|
|
10
|
-
stop: () =>
|
|
35
|
+
start: (p: PayloadOf<'gps.start'>) => inv('gps.start', p),
|
|
36
|
+
stop: () => inv('gps.stop', undefined),
|
|
11
37
|
onPosition: (cb: (d: DataOf<'gps.position'>) => void) => n().subscribe('gps.position', cb),
|
|
12
38
|
},
|
|
39
|
+
liveActivity: {
|
|
40
|
+
startWorkout: (p: PayloadOf<'liveActivity.startWorkout'>) => inv('liveActivity.startWorkout', p),
|
|
41
|
+
updateWorkout: (p: PayloadOf<'liveActivity.updateWorkout'>) => inv('liveActivity.updateWorkout', p),
|
|
42
|
+
endWorkout: () => inv('liveActivity.endWorkout', undefined),
|
|
43
|
+
startCardio: (p: PayloadOf<'liveActivity.startCardio'>) => inv('liveActivity.startCardio', p),
|
|
44
|
+
updateCardio: (p: PayloadOf<'liveActivity.updateCardio'>) => inv('liveActivity.updateCardio', p),
|
|
45
|
+
endCardio: () => inv('liveActivity.endCardio', undefined),
|
|
46
|
+
},
|
|
13
47
|
alarm: {
|
|
14
|
-
schedule: (p: PayloadOf<'alarm.schedule'>) =>
|
|
15
|
-
cancel: (p: PayloadOf<'alarm.cancel'>) =>
|
|
16
|
-
playAudio: (p: PayloadOf<'alarm.playAudio'>) =>
|
|
48
|
+
schedule: (p: PayloadOf<'alarm.schedule'>) => inv('alarm.schedule', p),
|
|
49
|
+
cancel: (p: PayloadOf<'alarm.cancel'>) => inv('alarm.cancel', p),
|
|
50
|
+
playAudio: (p: PayloadOf<'alarm.playAudio'>) => inv('alarm.playAudio', p),
|
|
17
51
|
onFired: (cb: (d: DataOf<'alarm.fired'>) => void) => n().subscribe('alarm.fired', cb),
|
|
18
52
|
},
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
53
|
+
tts: {
|
|
54
|
+
start: (p: PayloadOf<'tts.start'>) => inv('tts.start', p),
|
|
55
|
+
pause: () => inv('tts.pause', undefined),
|
|
56
|
+
resume: () => inv('tts.resume', undefined),
|
|
57
|
+
stop: () => inv('tts.stop', undefined),
|
|
58
|
+
onState: (cb: (d: DataOf<'tts.state'>) => void) => n().subscribe('tts.state', cb),
|
|
59
|
+
},
|
|
60
|
+
push: {
|
|
61
|
+
register: () => inv('push.register', undefined),
|
|
62
|
+
onToken: (cb: (d: DataOf<'push.token'>) => void) => n().subscribe('push.token', cb),
|
|
63
|
+
onNotificationClick: (cb: (d: DataOf<'push.notificationClick'>) => void) =>
|
|
64
|
+
n().subscribe('push.notificationClick', cb),
|
|
65
|
+
},
|
|
66
|
+
clipboard: {
|
|
67
|
+
write: (p: PayloadOf<'clipboard.write'>) => inv('clipboard.write', p),
|
|
68
|
+
read: () => inv('clipboard.read', undefined),
|
|
69
|
+
},
|
|
70
|
+
system: {
|
|
71
|
+
openExternal: (p: PayloadOf<'system.openExternal'>) => inv('system.openExternal', p),
|
|
72
|
+
share: (p: PayloadOf<'system.share'>) => inv('system.share', p),
|
|
73
|
+
},
|
|
74
|
+
badge: {
|
|
75
|
+
set: (p: PayloadOf<'badge.set'>) => inv('badge.set', p),
|
|
76
|
+
},
|
|
77
|
+
ui: {
|
|
78
|
+
getSafeArea: () => inv('ui.getSafeArea', undefined),
|
|
79
|
+
onKeyboardHeight: (cb: (d: DataOf<'keyboard.height'>) => void) => n().subscribe('keyboard.height', cb),
|
|
80
|
+
onSafeAreaInsets: (cb: (d: DataOf<'safeArea.insets'>) => void) => n().subscribe('safeArea.insets', cb),
|
|
81
|
+
},
|
|
82
|
+
fs: {
|
|
83
|
+
readFile: async (path: string) => {
|
|
84
|
+
await permissions.ensure('fs');
|
|
85
|
+
return (await inv('fs.readFile', { path })).content;
|
|
86
|
+
},
|
|
87
|
+
writeFile: async (path: string, content: string) => {
|
|
88
|
+
await permissions.ensure('fs');
|
|
89
|
+
return inv('fs.writeFile', { path, content });
|
|
90
|
+
},
|
|
91
|
+
mkdir: async (path: string, recursive = false) => {
|
|
92
|
+
await permissions.ensure('fs');
|
|
93
|
+
return inv('fs.mkdir', { path, recursive });
|
|
94
|
+
},
|
|
95
|
+
rm: async (path: string, opts: { recursive?: boolean; force?: boolean } = {}) => {
|
|
96
|
+
await permissions.ensure('fs');
|
|
97
|
+
return inv('fs.rm', { path, ...opts });
|
|
98
|
+
},
|
|
99
|
+
rename: async (from: string, to: string) => {
|
|
100
|
+
await permissions.ensure('fs');
|
|
101
|
+
return inv('fs.rename', { from, to });
|
|
102
|
+
},
|
|
103
|
+
readdir: async (path: string) => {
|
|
104
|
+
await permissions.ensure('fs');
|
|
105
|
+
return (await inv('fs.readdir', { path })).entries;
|
|
106
|
+
},
|
|
107
|
+
stat: async (path: string) => {
|
|
108
|
+
await permissions.ensure('fs');
|
|
109
|
+
return inv('fs.stat', { path });
|
|
110
|
+
},
|
|
111
|
+
exists: async (path: string) => {
|
|
112
|
+
await permissions.ensure('fs');
|
|
113
|
+
return (await inv('fs.exists', { path })).exists;
|
|
114
|
+
},
|
|
115
|
+
realpath: async (path: string) => {
|
|
116
|
+
await permissions.ensure('fs');
|
|
117
|
+
return (await inv('fs.realpath', { path })).path;
|
|
118
|
+
},
|
|
119
|
+
readFileBytes: async (path: string): Promise<Uint8Array> => {
|
|
120
|
+
await permissions.ensure('fs');
|
|
121
|
+
const fb = desktopBridge()?.fsBytes;
|
|
122
|
+
if (!fb) throw new NativeUnavailableError('fs.readFileBytes');
|
|
123
|
+
return fb.readFileBytes(path);
|
|
124
|
+
},
|
|
125
|
+
writeFileBytes: async (path: string, bytes: Uint8Array): Promise<void> => {
|
|
126
|
+
await permissions.ensure('fs');
|
|
127
|
+
const fb = desktopBridge()?.fsBytes;
|
|
128
|
+
if (!fb) throw new NativeUnavailableError('fs.writeFileBytes');
|
|
129
|
+
return fb.writeFileBytes(path, bytes);
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
process: createProcessFacade(() => desktopBridge()?.process as never, n().platform, () => permissions.ensure('process')),
|
|
133
|
+
net: createNetFacade(() => desktopBridge()?.net as never, n().platform, () => permissions.ensure('net')),
|
|
134
|
+
studio: createStudioFacade(() => desktopBridge()?.studio as never, n().platform),
|
|
135
|
+
secrets: {
|
|
136
|
+
get: async (key: string) => {
|
|
137
|
+
await permissions.ensure('secrets');
|
|
138
|
+
return (await inv('secrets.get', { key })).value;
|
|
139
|
+
},
|
|
140
|
+
set: async (key: string, value: string) => {
|
|
141
|
+
await permissions.ensure('secrets');
|
|
142
|
+
return inv('secrets.set', { key, value });
|
|
143
|
+
},
|
|
144
|
+
delete: async (key: string) => {
|
|
145
|
+
await permissions.ensure('secrets');
|
|
146
|
+
return inv('secrets.delete', { key });
|
|
147
|
+
},
|
|
148
|
+
list: async () => {
|
|
149
|
+
await permissions.ensure('secrets');
|
|
150
|
+
return (await inv('secrets.list', undefined)).keys;
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
serve: {
|
|
154
|
+
start: async (dir?: string) => {
|
|
155
|
+
await permissions.ensure('serve');
|
|
156
|
+
return inv('serve.start', { dir });
|
|
157
|
+
},
|
|
158
|
+
stop: async (port: number) => {
|
|
159
|
+
await permissions.ensure('serve');
|
|
160
|
+
return inv('serve.stop', { port });
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
workers: {
|
|
164
|
+
register: async (path: string, boot = false) => {
|
|
165
|
+
await permissions.ensure('workers');
|
|
166
|
+
return (await inv('workers.register', { path, boot })).id;
|
|
167
|
+
},
|
|
168
|
+
unregister: async (id: string) => {
|
|
169
|
+
await permissions.ensure('workers');
|
|
170
|
+
return inv('workers.unregister', { id });
|
|
171
|
+
},
|
|
172
|
+
list: async () => {
|
|
173
|
+
await permissions.ensure('workers');
|
|
174
|
+
return (await inv('workers.list', undefined)).ids;
|
|
175
|
+
},
|
|
26
176
|
},
|
|
27
177
|
};
|
|
28
178
|
|