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.
@@ -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<boolean>;
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
- return results;
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<boolean>;
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
- if (!this.isConnected) {
199
- this.emit("error", "Cannot load script: Not connected to a server");
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<boolean>;
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
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ive-connect",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "A universal haptic device control library for interactive experiences",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",