ive-connect 0.3.0 → 0.4.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/dist/core/device-interface.d.ts +4 -1
- package/dist/core/device-manager.d.ts +1 -1
- package/dist/core/device-manager.js +11 -4
- package/dist/devices/buttplug/buttplug-device.d.ts +4 -1
- package/dist/devices/buttplug/buttplug-device.js +11 -11
- package/dist/devices/handy/handy-device.d.ts +3 -1
- package/dist/devices/handy/handy-device.js +8 -7
- package/package.json +1 -1
|
@@ -85,7 +85,10 @@ export interface HapticDevice {
|
|
|
85
85
|
* Load a script for playback
|
|
86
86
|
* @param scriptData Script data to load
|
|
87
87
|
*/
|
|
88
|
-
loadScript(scriptData: ScriptData): Promise<
|
|
88
|
+
loadScript(scriptData: ScriptData): Promise<{
|
|
89
|
+
success: boolean;
|
|
90
|
+
scriptContent?: ScriptData;
|
|
91
|
+
}>;
|
|
89
92
|
/**
|
|
90
93
|
* Play the loaded script at the specified time
|
|
91
94
|
* @param timeMs Current time in milliseconds
|
|
@@ -46,7 +46,7 @@ export declare class DeviceManager extends EventEmitter {
|
|
|
46
46
|
* @param scriptData Script data to load
|
|
47
47
|
* @returns Object with success status for each device
|
|
48
48
|
*/
|
|
49
|
-
loadScriptAll(scriptData: ScriptData): Promise<Record<string, boolean>>;
|
|
49
|
+
loadScriptAll(scriptData: ScriptData): Promise<Record<string, boolean | ScriptData>>;
|
|
50
50
|
/**
|
|
51
51
|
* Start playback on all connected devices
|
|
52
52
|
* @param timeMs Current time in milliseconds
|
|
@@ -99,20 +99,27 @@ class DeviceManager extends events_1.EventEmitter {
|
|
|
99
99
|
const results = {};
|
|
100
100
|
this.scriptData = scriptData;
|
|
101
101
|
for (const [id, device] of this.devices.entries()) {
|
|
102
|
-
if (device.isConnected) {
|
|
102
|
+
if (device.isConnected || device.id === "buttplug") {
|
|
103
103
|
try {
|
|
104
104
|
results[id] = await device.loadScript(scriptData);
|
|
105
105
|
}
|
|
106
106
|
catch (error) {
|
|
107
107
|
console.error(`Error loading script to device ${id}:`, error);
|
|
108
|
-
results[id] = false;
|
|
108
|
+
results[id] = { success: false };
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
else {
|
|
112
|
-
results[id] = false;
|
|
112
|
+
results[id] = { success: false };
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
|
-
|
|
115
|
+
const transformedResults = {};
|
|
116
|
+
for (const [id, result] of Object.entries(results)) {
|
|
117
|
+
if (result.scriptContent) {
|
|
118
|
+
transformedResults["script"] = result.scriptContent;
|
|
119
|
+
}
|
|
120
|
+
transformedResults[id] = result.success;
|
|
121
|
+
}
|
|
122
|
+
return transformedResults;
|
|
116
123
|
}
|
|
117
124
|
/**
|
|
118
125
|
* Start playback on all connected devices
|
|
@@ -53,7 +53,10 @@ export declare class ButtplugDevice extends EventEmitter implements HapticDevice
|
|
|
53
53
|
/**
|
|
54
54
|
* Load a script for playback
|
|
55
55
|
*/
|
|
56
|
-
loadScript(scriptData: ScriptData): Promise<
|
|
56
|
+
loadScript(scriptData: ScriptData): Promise<{
|
|
57
|
+
success: boolean;
|
|
58
|
+
scriptContent?: any;
|
|
59
|
+
}>;
|
|
57
60
|
/**
|
|
58
61
|
* Play the loaded script
|
|
59
62
|
*/
|
|
@@ -195,13 +195,9 @@ class ButtplugDevice extends events_1.EventEmitter {
|
|
|
195
195
|
*/
|
|
196
196
|
async loadScript(scriptData) {
|
|
197
197
|
var _a, _b, _c;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
return false;
|
|
201
|
-
}
|
|
198
|
+
// Parse script data
|
|
199
|
+
let scriptContent;
|
|
202
200
|
try {
|
|
203
|
-
// Parse script data
|
|
204
|
-
let scriptContent;
|
|
205
201
|
if (scriptData.content) {
|
|
206
202
|
// If content is directly provided
|
|
207
203
|
scriptContent = scriptData.content;
|
|
@@ -245,12 +241,16 @@ class ButtplugDevice extends events_1.EventEmitter {
|
|
|
245
241
|
}
|
|
246
242
|
catch (error) {
|
|
247
243
|
this.emit("error", `Failed to fetch script: ${error instanceof Error ? error.message : String(error)}`);
|
|
248
|
-
return false;
|
|
244
|
+
return { success: false };
|
|
249
245
|
}
|
|
250
246
|
}
|
|
251
247
|
else {
|
|
252
248
|
this.emit("error", "Invalid script data: Either URL or content must be provided");
|
|
253
|
-
return false;
|
|
249
|
+
return { success: false };
|
|
250
|
+
}
|
|
251
|
+
if (!this.isConnected) {
|
|
252
|
+
this.emit("error", "Cannot load script: Not connected to a server");
|
|
253
|
+
return { success: false, scriptContent };
|
|
254
254
|
}
|
|
255
255
|
// Validate script format (basic checks for funscript)
|
|
256
256
|
if (!scriptContent ||
|
|
@@ -258,7 +258,7 @@ class ButtplugDevice extends events_1.EventEmitter {
|
|
|
258
258
|
!Array.isArray(scriptContent.actions)) {
|
|
259
259
|
this.emit("error", "Invalid script format: Missing actions array");
|
|
260
260
|
console.error("[BUTTPLUG-SCRIPT] Invalid script format:", scriptContent);
|
|
261
|
-
return false;
|
|
261
|
+
return { success: false, scriptContent };
|
|
262
262
|
}
|
|
263
263
|
// Sort actions by timestamp
|
|
264
264
|
const actions = [...scriptContent.actions].sort((a, b) => a.at - b.at);
|
|
@@ -271,12 +271,12 @@ class ButtplugDevice extends events_1.EventEmitter {
|
|
|
271
271
|
name: scriptContent.name || "Unnamed Script",
|
|
272
272
|
actions: this._currentScriptActions.length,
|
|
273
273
|
});
|
|
274
|
-
return true;
|
|
274
|
+
return { success: true, scriptContent };
|
|
275
275
|
}
|
|
276
276
|
catch (error) {
|
|
277
277
|
console.error("Buttplug: Error loading script:", error);
|
|
278
278
|
this.emit("error", `Script loading error: ${error instanceof Error ? error.message : String(error)}`);
|
|
279
|
-
return false;
|
|
279
|
+
return { success: false };
|
|
280
280
|
}
|
|
281
281
|
}
|
|
282
282
|
/**
|
|
@@ -62,7 +62,9 @@ export declare class HandyDevice extends EventEmitter implements HapticDevice {
|
|
|
62
62
|
* Load a script for playback
|
|
63
63
|
* @param scriptData Script data to load
|
|
64
64
|
*/
|
|
65
|
-
loadScript(scriptData: ScriptData): Promise<
|
|
65
|
+
loadScript(scriptData: ScriptData): Promise<{
|
|
66
|
+
success: boolean;
|
|
67
|
+
}>;
|
|
66
68
|
/**
|
|
67
69
|
* Play the loaded script at the specified time
|
|
68
70
|
* @param timeMs Current time in milliseconds
|
|
@@ -199,14 +199,15 @@ class HandyDevice extends events_1.EventEmitter {
|
|
|
199
199
|
async loadScript(scriptData) {
|
|
200
200
|
if (!this.isConnected) {
|
|
201
201
|
this.emit("error", "Cannot load script: Device not connected");
|
|
202
|
-
return false;
|
|
202
|
+
return { success: false };
|
|
203
203
|
}
|
|
204
204
|
try {
|
|
205
205
|
let scriptUrl;
|
|
206
206
|
// Handle script data based on type
|
|
207
207
|
if (scriptData.url) {
|
|
208
208
|
// If URL ends with .funscript and it's a direct URL, fetch and upload it
|
|
209
|
-
if (scriptData.url.toLowerCase().endsWith(".funscript")
|
|
209
|
+
if (scriptData.url.toLowerCase().endsWith(".funscript") ||
|
|
210
|
+
scriptData.type === "funscript") {
|
|
210
211
|
try {
|
|
211
212
|
const response = await fetch(scriptData.url);
|
|
212
213
|
if (!response.ok) {
|
|
@@ -240,29 +241,29 @@ class HandyDevice extends events_1.EventEmitter {
|
|
|
240
241
|
const uploadedUrl = await this._api.uploadScript(blob);
|
|
241
242
|
if (!uploadedUrl) {
|
|
242
243
|
this.emit("error", "Failed to upload script");
|
|
243
|
-
return false;
|
|
244
|
+
return { success: false };
|
|
244
245
|
}
|
|
245
246
|
scriptUrl = uploadedUrl;
|
|
246
247
|
}
|
|
247
248
|
else {
|
|
248
249
|
this.emit("error", "Invalid script data: Either URL or content must be provided");
|
|
249
|
-
return false;
|
|
250
|
+
return { success: false };
|
|
250
251
|
}
|
|
251
252
|
// Set up the script with the device
|
|
252
253
|
const success = await this._api.setupScript(scriptUrl);
|
|
253
254
|
if (success) {
|
|
254
255
|
this.emit("scriptLoaded", { url: scriptUrl });
|
|
255
|
-
return true;
|
|
256
|
+
return { success: true };
|
|
256
257
|
}
|
|
257
258
|
else {
|
|
258
259
|
this.emit("error", "Failed to set up script with device");
|
|
259
|
-
return false;
|
|
260
|
+
return { success: false };
|
|
260
261
|
}
|
|
261
262
|
}
|
|
262
263
|
catch (error) {
|
|
263
264
|
console.error("Handy: Error loading script:", error);
|
|
264
265
|
this.emit("error", `Script loading error: ${error instanceof Error ? error.message : String(error)}`);
|
|
265
|
-
return false;
|
|
266
|
+
return { success: false };
|
|
266
267
|
}
|
|
267
268
|
}
|
|
268
269
|
/**
|