{"_id":"@qawolf/run-globals-ios","_rev":"6-8686ce8dced6cde11e99b792a843ff03","name":"@qawolf/run-globals-ios","dist-tags":{"latest":"0.0.19"},"versions":{"0.0.18":{"name":"@qawolf/run-globals-ios","version":"0.0.18","keywords":["ios","testing","appium","webdriverio","audio","photos"],"author":{"name":"QA Wolf"},"license":"MIT","_id":"@qawolf/run-globals-ios@0.0.18","maintainers":[{"name":"atchyut.pulavarthi","email":"atchyut@qawolf.com"},{"name":"jperl","email":"perl.jonathan@gmail.com"},{"name":"flaurida","email":"laura@qawolf.com"},{"name":"jsamr","email":"jules.sam.randolph@gmail.com"},{"name":"matt.teran","email":"matthew.a.teran@gmail.com"},{"name":"denis-sokolov","email":"denis@sokolov.cc"},{"name":"mzqawolf","email":"mateus@qawolf.com"},{"name":"bbelkna77","email":"bob@qawolf.com"}],"homepage":"https://github.com/qawolf/ios-agent#readme","bugs":{"url":"https://github.com/qawolf/ios-agent/issues"},"dist":{"shasum":"f58a0e3478bba36bfa271015a0e9cd85b3b800fa","tarball":"https://registry.npmjs.org/@qawolf/run-globals-ios/-/run-globals-ios-0.0.18.tgz","fileCount":43,"integrity":"sha512-3ED9Aeq1AVrs1Pt1+N1L+4B5NTscRhOUGHo2WZ/r0eDlEuAJf6b4sitW9x+w7dP6QtrofilZe0LAQSnzVfybxw==","signatures":[{"sig":"MEUCIQDw7V8bN6OkVcwgU2pEy0MX4SAyLWOSQ18QB0QjDDrb6QIgfwbdc51K06kie8dKphesn/oRMU15EZxO0MszDBoXDY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142318},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"67a709b529874f3972ef8c1830151abbf9839cc6","private":false,"scripts":{"lint":"eslint src","test":"node --experimental-vm-modules ../../node_modules/jest/bin/jest.js --runInBand","build":"rm -rf ./dist && tsc -p tsconfig.build.json && npm run build:dts","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --fix","build:dts":"dts-bundle-generator --config dts.config.json --external-types webdriverio","tsc:check":"tsc --noEmit","test:watch":"node --experimental-vm-modules ../../node_modules/jest/bin/jest.js --watch --runInBand","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"node --experimental-vm-modules ../../node_modules/jest/bin/jest.js --coverage --runInBand","prepublishOnly":"rm -rf dist && npm run build"},"_npmUser":{"name":"mzqawolf","email":"mateus@qawolf.com"},"repository":{"url":"git+https://github.com/qawolf/ios-agent.git","type":"git","directory":"packages/run-globals-ios"},"_npmVersion":"11.8.0","description":"iOS testing utilities for QA Wolf","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^4.1.11","plist":"^3.1.0"},"publishConfig":{"access":"restricted","registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"webdriver":"^9.0.0","webdriverio":"^9.0.0","@types/plist":"^3.0.5","dts-bundle-generator":"^9.5.1"},"peerDependencies":{"webdriver":"^8.0.0 || ^9.0.0","webdriverio":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/run-globals-ios_0.0.18_1777672439873_0.5878617599542526","host":"s3://npm-registry-packages-npm-production"}},"0.0.19":{"name":"@qawolf/run-globals-ios","version":"0.0.19","keywords":["appium","audio","ios","photos","testing","webdriverio"],"author":{"name":"QA Wolf"},"license":"MIT","_id":"@qawolf/run-globals-ios@0.0.19","maintainers":[{"name":"atchyut.pulavarthi","email":"atchyut@qawolf.com"},{"name":"jperl","email":"perl.jonathan@gmail.com"},{"name":"flaurida","email":"laura@qawolf.com"},{"name":"matt.teran","email":"matthew.a.teran@gmail.com"},{"name":"denis-sokolov","email":"denis@sokolov.cc"},{"name":"mzqawolf","email":"mateus@qawolf.com"},{"name":"michael-pr","email":"michael@price.codes"},{"name":"bbelkna77","email":"bob@qawolf.com"}],"homepage":"https://github.com/qawolf/platform#readme","bugs":{"url":"https://github.com/qawolf/platform/issues"},"dist":{"shasum":"9e85ad04fbd89300ce46857e87e3d32e0209e33d","tarball":"https://registry.npmjs.org/@qawolf/run-globals-ios/-/run-globals-ios-0.0.19.tgz","fileCount":48,"integrity":"sha512-N4bWgAMfoc/JVIW9wNgWHWkDeZ3evfJ1xG9Y/DPHExsHa8aAYNIoFkckzH2LUoQPLf0CLQyNxxa3rOBFA6QgwQ==","signatures":[{"sig":"MEYCIQCI/YcJOblRCdSISclGGgmTybjx9Q1sJ7sMAYL4j7D0hwIhALfQCBvf36ZhksKOXI3Vrfe7SE3WbC3Xs9rhWpoAPV1A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCczAfCcGy98k6n+O8TtxJz6EFX1/Y0rkgKtPmg6v3Q/wIgFM0di8KNH7TkN/lfWmC0IcTLrE7kVSKbEDeCO+C2iTA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147162},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"2fa535c42f7004d9deb782d1a8a3f9821d6683f3","private":false,"scripts":{"test":"NODE_OPTIONS=\"--experimental-vm-modules\" NODE_NO_WARNINGS=1 jest --runInBand","build":"rm -rf ./dist && tsc -p tsconfig.build.json && npm run build:dts","lint:ci":"npm run lint:first-half; FIRST_HALF_EXIT=$?; npm run lint:second-half && exit $FIRST_HALF_EXIT","lint:dev":"npm run lint:first-half","build:dts":"dts-bundle-generator --config dts.config.json --external-types webdriverio","tsc:check":"tsc --noEmit","test:watch":"NODE_OPTIONS=\"--experimental-vm-modules\" NODE_NO_WARNINGS=1 jest --watch --runInBand","test:coverage":"NODE_OPTIONS=\"--experimental-vm-modules\" NODE_NO_WARNINGS=1 jest --coverage --runInBand","prepublishOnly":"nx run run-globals-ios:build","lint:first-half":"oxlint . --fix --quiet --report-unused-disable-directives --type-aware && oxfmt --write .","lint:second-half":"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'"},"_npmUser":{"name":"michael-pr","email":"michael@price.codes"},"repository":{"url":"git+https://github.com/qawolf/platform.git","type":"git","directory":"packages-published-public/run-globals-ios"},"_npmVersion":"11.19.1","description":"iOS testing utilities for QA Wolf","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^4.1.11","plist":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"webdriver":"^9.0.0","webdriverio":"^9.0.0","@types/plist":"^3.0.5","dts-bundle-generator":"^9.5.1"},"peerDependencies":{"webdriver":"^8.0.0 || ^9.0.0","webdriverio":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/run-globals-ios_0.0.19_1787908301467_0.7629315810351458","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-05-01T21:53:59.758Z","modified":"2026-08-28T20:53:54.562Z","0.0.18":"2026-05-01T21:54:00.023Z","0.0.19":"2026-08-28T09:11:41.566Z"},"bugs":{"url":"https://github.com/qawolf/platform/issues"},"author":{"name":"QA Wolf"},"license":"MIT","homepage":"https://github.com/qawolf/platform#readme","keywords":["appium","audio","ios","photos","testing","webdriverio"],"repository":{"url":"git+https://github.com/qawolf/platform.git","type":"git","directory":"packages-published-public/run-globals-ios"},"description":"iOS testing utilities for QA Wolf","maintainers":[{"email":"atchyut@qawolf.com","name":"atchyut.pulavarthi"},{"email":"perl.jonathan@gmail.com","name":"jperl"},{"email":"laura@qawolf.com","name":"flaurida"},{"email":"matthew.a.teran@gmail.com","name":"matt.teran"},{"email":"denis@sokolov.cc","name":"denis-sokolov"},{"email":"mateus@qawolf.com","name":"mzqawolf"},{"email":"jasonallen@qawolf.com","name":"jasonallen2022"},{"email":"michael@price.codes","name":"michael-pr"},{"email":"jaden@qawolf.com","name":"qawolfjaden"},{"email":"bob@qawolf.com","name":"bbelkna77"}],"readme":"# @qawolf/run-globals-ios\n\niOS testing utilities for QA Wolf - audio recording and photos management.\n\nThis package provides standalone functions for interacting with iOS devices through WebDriverIO, following the same flat API pattern as `run-globals-android`.\n\n## Installation\n\n```bash\nnpm install @qawolf/run-globals-ios\n```\n\n### Peer Dependencies\n\nThis package requires WebDriverIO as a peer dependency:\n\n```bash\nnpm install webdriverio webdriver\n```\n\n## Usage\n\n```typescript\nimport * as ios from \"@qawolf/run-globals-ios\";\n\n// Speaker audio recording (captures device audio output)\nconst session = await ios.startSpeakerRecording(driver);\nconsole.log(`Recording started with session ID: ${session.id}`);\n\n// Wait for some audio to be recorded\nawait new Promise((resolve) => setTimeout(resolve, 5000));\n\n// Stop recording - this also calculates the fingerprint automatically\nconst file = await ios.stopSpeakerRecording(driver, session.id);\nconsole.log(`Recording saved to: ${file.filename}`);\nif (file.fingerprint) {\n  console.log(`Fingerprint has ${file.fingerprint.length} values`);\n}\n\n// Download the audio file\nconst audioBuffer = await ios.downloadSpeakerRecording(driver, file.filename);\nfs.writeFileSync(\"/tmp/recording.wav\", audioBuffer);\n\n// Calculate fingerprint for a reference audio file\nconst referenceAudio = fs.readFileSync(\"/tmp/reference.wav\");\nconst fingerprint = await ios.calculateAudioFingerprint(driver, referenceAudio);\nconsole.log(`Reference duration: ${fingerprint.duration}s`);\n\n// Save a photo from local filesystem to device Photos library\nconst result = await ios.savePhoto(driver, \"/Users/me/test-photo.jpg\");\nif (result.success) {\n  console.log(\"Photo saved to library\");\n}\n\n// List all photos in the library\nconst photoList = await ios.listPhotos(driver);\nconsole.log(`Found ${photoList.totalCount} photos`);\n\n// Clean up - delete all photos (useful for test cleanup)\nawait ios.deleteAllPhotos(driver);\nconsole.log(\"All photos deleted\");\n```\n\n## API Reference\n\n### Speaker Audio Recording Functions\n\n#### `startSpeakerRecording(driver)`\n\nStart recording speaker/system audio output on the iOS device.\n\n- **Parameters:**\n  - `driver: Browser` - WebDriverIO browser instance\n- **Returns:** `Promise<SpeakerRecordingSession>` - Session information with ID\n- **Throws:** Error if recording fails to start\n\n#### `stopSpeakerRecording(driver, sessionId)`\n\nStop speaker audio recording and finalize the file. Automatically calculates audio fingerprint.\n\n- **Parameters:**\n  - `driver: Browser` - WebDriverIO browser instance\n  - `sessionId: string` - Session ID from `startSpeakerRecording()`\n- **Returns:** `Promise<SpeakerRecordingFile>` - File information including optional fingerprint\n- **Throws:** Error if session ID is invalid or stop fails\n\n#### `downloadSpeakerRecording(driver, filename)`\n\nDownload a recorded speaker audio file as a Buffer (WAV format).\n\n- **Parameters:**\n  - `driver: Browser` - WebDriverIO browser instance\n  - `filename: string` - Filename from `stopSpeakerRecording()`\n- **Returns:** `Promise<Buffer>` - Audio file contents\n- **Throws:** Error if file doesn't exist\n\n#### `calculateAudioFingerprint(driver, audioData)`\n\nCalculate audio fingerprint from audio data.\n\n- **Parameters:**\n  - `driver: Browser` - WebDriverIO browser instance\n  - `audioData: Buffer | string` - WAV audio data as Buffer or base64 string\n- **Returns:** `Promise<AudioFingerprint>` - Fingerprint and duration\n- **Throws:** Error if audio data is invalid\n\n### Photo Functions\n\n#### `savePhoto(driver, filePath)`\n\nSave a file from the filesystem to the device Photos library. Handles the complete workflow including file transfer and cleanup.\n\n- **Parameters:**\n  - `driver: Browser` - WebDriverIO browser instance\n  - `filePath: string` - Absolute path to file on the filesystem\n- **Returns:** `Promise<SavePhotoResult>` - Success status and optional message\n- **Throws:** Error if file doesn't exist or save fails\n\n#### `listPhotos(driver)`\n\nList all photos and videos from the Photos library.\n\n- **Parameters:**\n  - `driver: Browser` - WebDriverIO browser instance\n- **Returns:** `Promise<ListPhotosResult>` - Result with assets array and count\n- **Throws:** Error if listing fails\n\n#### `deleteAllPhotos(driver)`\n\nDelete all photos and videos from the Photos library. Useful for test cleanup.\n\n- **Parameters:**\n  - `driver: Browser` - WebDriverIO browser instance\n- **Returns:** `Promise<DeletePhotosResult>` - Result with deleted count\n- **Throws:** Error if deletion fails\n\n## Types\n\n### `SpeakerRecordingSession`\n\n```typescript\ninterface SpeakerRecordingSession {\n  id: string; // Unique session identifier\n  status: string; // Recording status\n}\n```\n\n### `SpeakerRecordingFile`\n\n```typescript\ninterface SpeakerRecordingFile {\n  filename: string; // Name of the audio file\n  fingerprint?: number[]; // Optional audio fingerprint (array of integers)\n  duration?: number; // Optional duration in seconds\n}\n```\n\n### `AudioFingerprint`\n\n```typescript\ninterface AudioFingerprint {\n  fingerprint: number[]; // Audio fingerprint (array of integers)\n  duration: number; // Duration in seconds\n}\n```\n\n### `PhotoAsset`\n\n```typescript\ninterface PhotoAsset {\n  localIdentifier: string;\n  mediaType: string;\n  mediaSubtype: string;\n  creationDate: string;\n  modificationDate: string;\n  pixelWidth: number;\n  pixelHeight: number;\n  duration: number;\n  isFavorite: boolean;\n  isHidden: boolean;\n}\n```\n\n### `SavePhotoResult`\n\n```typescript\ninterface SavePhotoResult {\n  success: boolean; // Whether save was successful\n  message?: string; // Optional additional information\n}\n```\n\n### `ListPhotosResult`\n\n```typescript\ninterface ListPhotosResult {\n  success: boolean;\n  assets: PhotoAsset[];\n  totalCount: number;\n}\n```\n\n### `DeletePhotosResult`\n\n```typescript\ninterface DeletePhotosResult {\n  success: boolean;\n  deletedCount: number;\n  message?: string;\n}\n```\n\n## Architecture\n\nThis package provides a clean, fetch-based HTTP API for iOS testing:\n\n- **Flat API**: All functions are exported directly for easy autocomplete\n- **Direct HTTP communication**: Uses native `fetch` API to communicate with Appium/WebDriver server\n- **No driver mutation**: Functions make direct HTTP calls without registering custom commands\n- **Full TypeScript support**: Complete type definitions with comprehensive JSDoc documentation\n- **Explicit dependencies**: Driver is passed explicitly to extract connection information\n\n## Requirements\n\n- Node.js ^20\n- WebDriverIO ^8.0.0 or ^9.0.0\n- iOS device or simulator with QA Wolf iOS Agent installed\n- Appium server with ios-agent running\n\n## License\n\nMIT\n","readmeFilename":"README.md"}