@sendbird/uikit-react-native 3.10.3 → 3.11.1
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/README.md +9 -7
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js +1 -1
- package/lib/commonjs/components/ChannelInput/VoiceMessageInput.js.map +1 -1
- package/lib/commonjs/components/ChannelInput/index.js +2 -25
- package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
- package/lib/commonjs/hooks/useVoiceMessageInput.js +10 -2
- package/lib/commonjs/hooks/useVoiceMessageInput.js.map +1 -1
- package/lib/commonjs/platform/createFileService.native.js +1 -1
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/platform/createMediaService.expo.js +83 -12
- package/lib/commonjs/platform/createMediaService.expo.js.map +1 -1
- package/lib/commonjs/platform/createPlayerService.expo.js +214 -113
- package/lib/commonjs/platform/createPlayerService.expo.js.map +1 -1
- package/lib/commonjs/platform/createPlayerService.native.js +191 -114
- package/lib/commonjs/platform/createPlayerService.native.js.map +1 -1
- package/lib/commonjs/platform/createRecorderService.expo.js +248 -127
- package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -1
- package/lib/commonjs/platform/createRecorderService.native.js +212 -129
- package/lib/commonjs/platform/createRecorderService.native.js.map +1 -1
- package/lib/commonjs/platform/types.js.map +1 -1
- package/lib/commonjs/utils/expoBackwardUtils.js +23 -0
- package/lib/commonjs/utils/expoBackwardUtils.js.map +1 -1
- package/lib/commonjs/utils/expoPermissionGranted.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelInput/VoiceMessageInput.js +1 -1
- package/lib/module/components/ChannelInput/VoiceMessageInput.js.map +1 -1
- package/lib/module/components/ChannelInput/index.js +3 -26
- package/lib/module/components/ChannelInput/index.js.map +1 -1
- package/lib/module/hooks/useVoiceMessageInput.js +10 -2
- package/lib/module/hooks/useVoiceMessageInput.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +1 -1
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/platform/createMediaService.expo.js +82 -13
- package/lib/module/platform/createMediaService.expo.js.map +1 -1
- package/lib/module/platform/createPlayerService.expo.js +214 -113
- package/lib/module/platform/createPlayerService.expo.js.map +1 -1
- package/lib/module/platform/createPlayerService.native.js +191 -114
- package/lib/module/platform/createPlayerService.native.js.map +1 -1
- package/lib/module/platform/createRecorderService.expo.js +249 -128
- package/lib/module/platform/createRecorderService.expo.js.map +1 -1
- package/lib/module/platform/createRecorderService.native.js +212 -129
- package/lib/module/platform/createRecorderService.native.js.map +1 -1
- package/lib/module/platform/types.js.map +1 -1
- package/lib/module/utils/expoBackwardUtils.js +23 -0
- package/lib/module/utils/expoBackwardUtils.js.map +1 -1
- package/lib/module/utils/expoPermissionGranted.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/platform/createMediaService.expo.d.ts +2 -2
- package/lib/typescript/src/platform/createPlayerService.expo.d.ts +2 -2
- package/lib/typescript/src/platform/createPlayerService.native.d.ts +5 -3
- package/lib/typescript/src/platform/createRecorderService.expo.d.ts +2 -2
- package/lib/typescript/src/platform/createRecorderService.native.d.ts +5 -3
- package/lib/typescript/src/platform/types.d.ts +4 -0
- package/lib/typescript/src/utils/expoBackwardUtils.d.ts +10 -0
- package/lib/typescript/src/utils/expoPermissionGranted.d.ts +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +29 -5
- package/src/components/ChannelInput/VoiceMessageInput.tsx +1 -1
- package/src/components/ChannelInput/index.tsx +6 -36
- package/src/hooks/useVoiceMessageInput.ts +7 -2
- package/src/platform/createFileService.native.ts +1 -1
- package/src/platform/createMediaService.expo.tsx +87 -9
- package/src/platform/createPlayerService.expo.tsx +242 -109
- package/src/platform/createPlayerService.native.tsx +237 -113
- package/src/platform/createRecorderService.expo.tsx +268 -107
- package/src/platform/createRecorderService.native.tsx +240 -118
- package/src/platform/types.ts +5 -0
- package/src/utils/expoBackwardUtils.ts +29 -0
- package/src/utils/expoPermissionGranted.ts +3 -1
- package/src/version.ts +1 -1
|
@@ -2,148 +2,269 @@ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object
|
|
|
2
2
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
3
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
4
4
|
import { Platform } from 'react-native';
|
|
5
|
-
import { matchesOneOf, sleep } from '@sendbird/uikit-utils';
|
|
5
|
+
import { Logger, matchesOneOf, sleep } from '@sendbird/uikit-utils';
|
|
6
6
|
import VoiceMessageConfig from '../libs/VoiceMessageConfig';
|
|
7
|
+
import expoBackwardUtils from '../utils/expoBackwardUtils';
|
|
7
8
|
import expoPermissionGranted from '../utils/expoPermissionGranted';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
class BaseAudioRecorderAdapter {
|
|
10
|
+
constructor() {
|
|
11
|
+
_defineProperty(this, "uri", undefined);
|
|
12
|
+
_defineProperty(this, "state", 'idle');
|
|
13
|
+
_defineProperty(this, "options", {
|
|
14
|
+
minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,
|
|
15
|
+
maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,
|
|
16
|
+
extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION
|
|
17
|
+
});
|
|
18
|
+
_defineProperty(this, "_audioSettings", {
|
|
19
|
+
sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,
|
|
20
|
+
bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,
|
|
21
|
+
numberOfChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS
|
|
22
|
+
// encoding: mpeg4_aac
|
|
23
|
+
});
|
|
24
|
+
_defineProperty(this, "_recordingSubscribers", new Set());
|
|
25
|
+
_defineProperty(this, "_stateSubscribers", new Set());
|
|
26
|
+
// NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs
|
|
27
|
+
_defineProperty(this, "_recordStartedAt", 0);
|
|
28
|
+
_defineProperty(this, "_getRecorderStopSafeBuffer", () => {
|
|
29
|
+
const minWaitingTime = 500;
|
|
30
|
+
const elapsedTime = Date.now() - this._recordStartedAt;
|
|
31
|
+
if (elapsedTime > minWaitingTime) return 0;else return minWaitingTime - elapsedTime;
|
|
32
|
+
});
|
|
33
|
+
_defineProperty(this, "setState", state => {
|
|
34
|
+
this.state = state;
|
|
35
|
+
this._stateSubscribers.forEach(callback => {
|
|
36
|
+
callback(state);
|
|
19
37
|
});
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
38
|
+
});
|
|
39
|
+
_defineProperty(this, "addRecordingListener", callback => {
|
|
40
|
+
this._recordingSubscribers.add(callback);
|
|
41
|
+
return () => {
|
|
42
|
+
this._recordingSubscribers.delete(callback);
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
_defineProperty(this, "addStateListener", callback => {
|
|
46
|
+
this._stateSubscribers.add(callback);
|
|
47
|
+
return () => {
|
|
48
|
+
this._stateSubscribers.delete(callback);
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
_defineProperty(this, "convertRecordPath", uri => {
|
|
52
|
+
return uri;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
class LegacyExpoAVRecorderAdapter extends BaseAudioRecorderAdapter {
|
|
57
|
+
constructor(avModule) {
|
|
58
|
+
super();
|
|
59
|
+
_defineProperty(this, "avModule", void 0);
|
|
60
|
+
_defineProperty(this, "_recorder", void 0);
|
|
61
|
+
_defineProperty(this, "_audioOptions", void 0);
|
|
62
|
+
_defineProperty(this, "prepare", async () => {
|
|
63
|
+
this.setState('preparing');
|
|
64
|
+
if (Platform.OS === 'ios') {
|
|
65
|
+
await this.avModule.Audio.setAudioModeAsync({
|
|
66
|
+
allowsRecordingIOS: true,
|
|
67
|
+
playsInSilentModeIOS: true
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (this._recorder._isDoneRecording) {
|
|
71
|
+
this._recorder = new this.avModule.Audio.Recording();
|
|
72
|
+
}
|
|
73
|
+
this._recorder.setProgressUpdateInterval(100);
|
|
74
|
+
this._recorder.setOnRecordingStatusUpdate(status => {
|
|
75
|
+
const completed = status.durationMillis >= this.options.maxDuration;
|
|
76
|
+
if (completed) this.stop();
|
|
77
|
+
if (status.isRecording) {
|
|
78
|
+
this._recordingSubscribers.forEach(callback => {
|
|
79
|
+
callback({
|
|
80
|
+
currentTime: status.durationMillis,
|
|
81
|
+
completed: completed
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
50
85
|
});
|
|
51
|
-
|
|
52
|
-
|
|
86
|
+
await this._recorder.prepareToRecordAsync(this._audioOptions);
|
|
87
|
+
});
|
|
88
|
+
_defineProperty(this, "requestPermission", async () => {
|
|
89
|
+
const status = await this.avModule.Audio.getPermissionsAsync();
|
|
90
|
+
if (expoPermissionGranted([status])) {
|
|
91
|
+
return true;
|
|
92
|
+
} else {
|
|
93
|
+
const status = await this.avModule.Audio.requestPermissionsAsync();
|
|
94
|
+
return expoPermissionGranted([status]);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
_defineProperty(this, "record", async () => {
|
|
98
|
+
if (matchesOneOf(this.state, ['idle', 'completed'])) {
|
|
99
|
+
try {
|
|
100
|
+
await this.prepare();
|
|
101
|
+
await this._recorder.startAsync();
|
|
102
|
+
if (Platform.OS === 'android') {
|
|
103
|
+
this._recordStartedAt = Date.now();
|
|
104
|
+
}
|
|
105
|
+
const uri = this._recorder.getURI();
|
|
106
|
+
if (uri) this.uri = uri;
|
|
107
|
+
this.setState('recording');
|
|
108
|
+
} catch (e) {
|
|
109
|
+
this.setState('idle');
|
|
110
|
+
throw e;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
_defineProperty(this, "stop", async () => {
|
|
115
|
+
if (matchesOneOf(this.state, ['recording'])) {
|
|
116
|
+
if (Platform.OS === 'android') {
|
|
117
|
+
const buffer = this._getRecorderStopSafeBuffer();
|
|
118
|
+
if (buffer > 0) await sleep(buffer);
|
|
119
|
+
}
|
|
120
|
+
await this._recorder.stopAndUnloadAsync();
|
|
53
121
|
if (Platform.OS === 'ios') {
|
|
54
|
-
await avModule.Audio.setAudioModeAsync({
|
|
55
|
-
allowsRecordingIOS:
|
|
56
|
-
playsInSilentModeIOS:
|
|
122
|
+
await this.avModule.Audio.setAudioModeAsync({
|
|
123
|
+
allowsRecordingIOS: false,
|
|
124
|
+
playsInSilentModeIOS: false
|
|
57
125
|
});
|
|
58
126
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
127
|
+
this.setState('completed');
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
_defineProperty(this, "reset", async () => {
|
|
131
|
+
await this.stop();
|
|
132
|
+
this.uri = undefined;
|
|
133
|
+
this._recordingSubscribers.clear();
|
|
134
|
+
this._recorder = new this.avModule.Audio.Recording();
|
|
135
|
+
this.setState('idle');
|
|
136
|
+
});
|
|
137
|
+
this.avModule = avModule;
|
|
138
|
+
this._recorder = new avModule.Audio.Recording();
|
|
139
|
+
this._audioOptions = {
|
|
140
|
+
android: {
|
|
141
|
+
...this._audioSettings,
|
|
142
|
+
extension: `.${this.options.extension}`,
|
|
143
|
+
audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,
|
|
144
|
+
outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4
|
|
145
|
+
},
|
|
146
|
+
ios: {
|
|
147
|
+
...this._audioSettings,
|
|
148
|
+
extension: `.${this.options.extension}`,
|
|
149
|
+
outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,
|
|
150
|
+
audioQuality: avModule.Audio.IOSAudioQuality.HIGH
|
|
151
|
+
},
|
|
152
|
+
web: {}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
class ExpoAudioRecorderAdapter extends BaseAudioRecorderAdapter {
|
|
157
|
+
constructor(audioModule) {
|
|
158
|
+
super();
|
|
159
|
+
_defineProperty(this, "audioModule", void 0);
|
|
160
|
+
_defineProperty(this, "recorder", null);
|
|
161
|
+
_defineProperty(this, "recordingUpdateInterval", null);
|
|
162
|
+
_defineProperty(this, "setListener", () => {
|
|
163
|
+
if (!this.recorder) return;
|
|
164
|
+
this.recordingUpdateInterval = setInterval(() => {
|
|
165
|
+
if (this.recorder && this.recorder.isRecording) {
|
|
166
|
+
const currentTime = this.recorder.currentTime * 1000;
|
|
167
|
+
const completed = currentTime >= this.options.maxDuration;
|
|
168
|
+
if (completed) {
|
|
169
|
+
this.stop().catch(error => {
|
|
170
|
+
Logger.warn('[RecorderService.Expo] Failed to stop in update interval', error);
|
|
72
171
|
});
|
|
73
172
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
callback(state);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
_defineProperty(this, "requestPermission", async () => {
|
|
84
|
-
const status = await avModule.Audio.getPermissionsAsync();
|
|
85
|
-
if (expoPermissionGranted([status])) {
|
|
86
|
-
return true;
|
|
87
|
-
} else {
|
|
88
|
-
const status = await avModule.Audio.requestPermissionsAsync();
|
|
89
|
-
return expoPermissionGranted([status]);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
_defineProperty(this, "addRecordingListener", callback => {
|
|
93
|
-
this._recordingSubscribers.add(callback);
|
|
94
|
-
return () => {
|
|
95
|
-
this._recordingSubscribers.delete(callback);
|
|
96
|
-
};
|
|
97
|
-
});
|
|
98
|
-
_defineProperty(this, "addStateListener", callback => {
|
|
99
|
-
this._stateSubscribers.add(callback);
|
|
100
|
-
return () => {
|
|
101
|
-
this._stateSubscribers.delete(callback);
|
|
102
|
-
};
|
|
103
|
-
});
|
|
104
|
-
_defineProperty(this, "record", async () => {
|
|
105
|
-
if (matchesOneOf(this.state, ['idle', 'completed'])) {
|
|
106
|
-
try {
|
|
107
|
-
await this.prepare();
|
|
108
|
-
await this._recorder.startAsync();
|
|
109
|
-
if (Platform.OS === 'android') {
|
|
110
|
-
this._recordStartedAt = Date.now();
|
|
111
|
-
}
|
|
112
|
-
const uri = this._recorder.getURI();
|
|
113
|
-
if (uri) this.uri = uri;
|
|
114
|
-
this.setState('recording');
|
|
115
|
-
} catch (e) {
|
|
116
|
-
this.setState('idle');
|
|
117
|
-
throw e;
|
|
118
|
-
}
|
|
173
|
+
this._recordingSubscribers.forEach(callback => {
|
|
174
|
+
callback({
|
|
175
|
+
currentTime,
|
|
176
|
+
completed
|
|
177
|
+
});
|
|
178
|
+
});
|
|
119
179
|
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
|
|
180
|
+
}, 100);
|
|
181
|
+
});
|
|
182
|
+
_defineProperty(this, "removeListener", () => {
|
|
183
|
+
if (this.recordingUpdateInterval) {
|
|
184
|
+
clearInterval(this.recordingUpdateInterval);
|
|
185
|
+
this.recordingUpdateInterval = null;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
_defineProperty(this, "prepare", async () => {
|
|
189
|
+
this.setState('preparing');
|
|
190
|
+
if (Platform.OS === 'ios') {
|
|
191
|
+
await this.audioModule.setAudioModeAsync({
|
|
192
|
+
allowsRecording: true,
|
|
193
|
+
playsInSilentMode: true
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const recordingOptions = {
|
|
197
|
+
...this._audioSettings,
|
|
198
|
+
extension: `.${this.options.extension}`
|
|
199
|
+
};
|
|
200
|
+
this.recorder = new this.audioModule.AudioModule.AudioRecorder(recordingOptions);
|
|
201
|
+
await this.recorder.prepareToRecordAsync();
|
|
202
|
+
});
|
|
203
|
+
_defineProperty(this, "requestPermission", async () => {
|
|
204
|
+
const status = await this.audioModule.getRecordingPermissionsAsync();
|
|
205
|
+
if (expoPermissionGranted([status])) {
|
|
206
|
+
return true;
|
|
207
|
+
} else {
|
|
208
|
+
const status = await this.audioModule.requestRecordingPermissionsAsync();
|
|
209
|
+
return expoPermissionGranted([status]);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
_defineProperty(this, "record", async () => {
|
|
213
|
+
if (matchesOneOf(this.state, ['idle', 'completed'])) {
|
|
214
|
+
try {
|
|
215
|
+
var _this$recorder, _this$recorder2;
|
|
216
|
+
await this.prepare();
|
|
217
|
+
this.setListener();
|
|
218
|
+
(_this$recorder = this.recorder) === null || _this$recorder === void 0 || _this$recorder.record();
|
|
123
219
|
if (Platform.OS === 'android') {
|
|
124
|
-
|
|
125
|
-
if (buffer > 0) await sleep(buffer);
|
|
126
|
-
}
|
|
127
|
-
await this._recorder.stopAndUnloadAsync();
|
|
128
|
-
if (Platform.OS === 'ios') {
|
|
129
|
-
await avModule.Audio.setAudioModeAsync({
|
|
130
|
-
allowsRecordingIOS: false,
|
|
131
|
-
playsInSilentModeIOS: false
|
|
132
|
-
});
|
|
220
|
+
this._recordStartedAt = Date.now();
|
|
133
221
|
}
|
|
134
|
-
this.
|
|
222
|
+
const uri = (_this$recorder2 = this.recorder) === null || _this$recorder2 === void 0 ? void 0 : _this$recorder2.uri;
|
|
223
|
+
if (uri) this.uri = uri;
|
|
224
|
+
this.setState('recording');
|
|
225
|
+
} catch (e) {
|
|
226
|
+
this.setState('idle');
|
|
227
|
+
this.removeListener();
|
|
228
|
+
throw e;
|
|
135
229
|
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
_defineProperty(this, "stop", async () => {
|
|
233
|
+
if (matchesOneOf(this.state, ['recording'])) {
|
|
234
|
+
var _this$recorder3;
|
|
235
|
+
if (Platform.OS === 'android') {
|
|
236
|
+
const buffer = this._getRecorderStopSafeBuffer();
|
|
237
|
+
if (buffer > 0) await sleep(buffer);
|
|
238
|
+
}
|
|
239
|
+
await ((_this$recorder3 = this.recorder) === null || _this$recorder3 === void 0 ? void 0 : _this$recorder3.stop());
|
|
240
|
+
this.removeListener();
|
|
241
|
+
if (Platform.OS === 'ios') {
|
|
242
|
+
await this.audioModule.setAudioModeAsync({
|
|
243
|
+
allowsRecording: false,
|
|
244
|
+
playsInSilentMode: false
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
this.setState('completed');
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
_defineProperty(this, "reset", async () => {
|
|
251
|
+
await this.stop();
|
|
252
|
+
this.recorder = null;
|
|
253
|
+
this.uri = undefined;
|
|
254
|
+
this._recordingSubscribers.clear();
|
|
255
|
+
this._stateSubscribers.clear();
|
|
256
|
+
this.setState('idle');
|
|
257
|
+
});
|
|
258
|
+
this.audioModule = audioModule;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const createExpoRecorderService = ({
|
|
262
|
+
avModule
|
|
263
|
+
}) => {
|
|
264
|
+
if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {
|
|
265
|
+
Logger.warn('[RecorderService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-audio.');
|
|
145
266
|
}
|
|
146
|
-
return new
|
|
267
|
+
return expoBackwardUtils.expoAV.isAudioModule(avModule) ? new ExpoAudioRecorderAdapter(avModule) : new LegacyExpoAVRecorderAdapter(avModule);
|
|
147
268
|
};
|
|
148
269
|
export default createExpoRecorderService;
|
|
149
270
|
//# sourceMappingURL=createRecorderService.expo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","matchesOneOf","sleep","VoiceMessageConfig","expoPermissionGranted","createExpoRecorderService","avModule","VoiceRecorder","constructor","_defineProperty","undefined","minDuration","DEFAULT","RECORDER","MIN_DURATION","maxDuration","MAX_DURATION","extension","EXTENSION","minWaitingTime","elapsedTime","Date","now","_recordStartedAt","Audio","Recording","Set","sampleRate","SAMPLE_RATE","bitRate","BIT_RATE","numberOfChannels","CHANNELS","android","_audioSettings","options","audioEncoder","AndroidAudioEncoder","AAC","outputFormat","AndroidOutputFormat","MPEG_4","ios","IOSOutputFormat","MPEG4AAC","audioQuality","IOSAudioQuality","HIGH","web","setState","OS","setAudioModeAsync","allowsRecordingIOS","playsInSilentModeIOS","_recorder","_isDoneRecording","setProgressUpdateInterval","setOnRecordingStatusUpdate","status","completed","durationMillis","stop","isRecording","_recordingSubscribers","forEach","callback","currentTime","prepareToRecordAsync","_audioOptions","state","_stateSubscribers","getPermissionsAsync","requestPermissionsAsync","add","delete","prepare","startAsync","uri","getURI","e","buffer","_getRecorderStopSafeBuffer","stopAndUnloadAsync","clear"],"sources":["createRecorderService.expo.tsx"],"sourcesContent":["import * as ExpoAV from 'expo-av';\nimport type { RecordingOptions } from 'expo-av/build/Audio/Recording.types';\nimport { Platform } from 'react-native';\n\nimport { matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport VoiceMessageConfig from '../libs/VoiceMessageConfig';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { RecorderServiceInterface, Unsubscribe } from './types';\n\ntype RecordingListener = Parameters<RecorderServiceInterface['addRecordingListener']>[number];\ntype StateListener = Parameters<RecorderServiceInterface['addStateListener']>[number];\ntype Modules = {\n avModule: typeof ExpoAV;\n};\nconst createExpoRecorderService = ({ avModule }: Modules): RecorderServiceInterface => {\n class VoiceRecorder implements RecorderServiceInterface {\n public uri: RecorderServiceInterface['uri'] = undefined;\n public state: RecorderServiceInterface['state'] = 'idle';\n public options: RecorderServiceInterface['options'] = {\n minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,\n maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,\n extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION,\n };\n\n // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs\n private _recordStartedAt = 0;\n private _getRecorderStopSafeBuffer = () => {\n const minWaitingTime = 500;\n const elapsedTime = Date.now() - this._recordStartedAt;\n if (elapsedTime > minWaitingTime) return 0;\n else return minWaitingTime - elapsedTime;\n };\n\n private _recorder = new avModule.Audio.Recording();\n private readonly _recordingSubscribers = new Set<RecordingListener>();\n private readonly _stateSubscribers = new Set<StateListener>();\n private readonly _audioSettings = {\n sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,\n bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,\n numberOfChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS,\n // encoding: mpeg4_aac\n };\n private readonly _audioOptions: RecordingOptions = {\n android: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,\n outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4,\n },\n ios: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,\n audioQuality: avModule.Audio.IOSAudioQuality.HIGH,\n },\n web: {},\n };\n\n private prepare = async () => {\n this.setState('preparing');\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: true, playsInSilentModeIOS: true });\n }\n\n if (this._recorder._isDoneRecording) {\n this._recorder = new avModule.Audio.Recording();\n }\n this._recorder.setProgressUpdateInterval(100);\n this._recorder.setOnRecordingStatusUpdate((status) => {\n const completed = status.durationMillis >= this.options.maxDuration;\n if (completed) this.stop();\n if (status.isRecording) {\n this._recordingSubscribers.forEach((callback) => {\n callback({ currentTime: status.durationMillis, completed: completed });\n });\n }\n });\n await this._recorder.prepareToRecordAsync(this._audioOptions);\n };\n\n private setState = (state: RecorderServiceInterface['state']) => {\n this.state = state;\n this._stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public addRecordingListener = (callback: RecordingListener): Unsubscribe => {\n this._recordingSubscribers.add(callback);\n return () => {\n this._recordingSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: StateListener): Unsubscribe => {\n this._stateSubscribers.add(callback);\n return () => {\n this._stateSubscribers.delete(callback);\n };\n };\n\n public record = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n await this.prepare();\n await this._recorder.startAsync();\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n const uri = this._recorder.getURI();\n if (uri) this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await this._recorder.stopAndUnloadAsync();\n if (Platform.OS === 'ios') {\n await avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: false, playsInSilentModeIOS: false });\n }\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.uri = undefined;\n this._recordingSubscribers.clear();\n this._recorder = new avModule.Audio.Recording();\n this.setState('idle');\n };\n }\n\n return new VoiceRecorder();\n};\n\nexport default createExpoRecorderService;\n"],"mappings":";;;AAEA,SAASA,QAAQ,QAAQ,cAAc;AAEvC,SAASC,YAAY,EAAEC,KAAK,QAAQ,uBAAuB;AAE3D,OAAOC,kBAAkB,MAAM,4BAA4B;AAC3D,OAAOC,qBAAqB,MAAM,gCAAgC;AAQlE,MAAMC,yBAAyB,GAAGA,CAAC;EAAEC;AAAkB,CAAC,KAA+B;EACrF,MAAMC,aAAa,CAAqC;IAAAC,YAAA;MAAAC,eAAA,cACRC,SAAS;MAAAD,eAAA,gBACL,MAAM;MAAAA,eAAA,kBACF;QACpDE,WAAW,EAAER,kBAAkB,CAACS,OAAO,CAACC,QAAQ,CAACC,YAAY;QAC7DC,WAAW,EAAEZ,kBAAkB,CAACS,OAAO,CAACC,QAAQ,CAACG,YAAY;QAC7DC,SAAS,EAAEd,kBAAkB,CAACS,OAAO,CAACC,QAAQ,CAACK;MACjD,CAAC;MAED;MAAAT,eAAA,2BAC2B,CAAC;MAAAA,eAAA,qCACS,MAAM;QACzC,MAAMU,cAAc,GAAG,GAAG;QAC1B,MAAMC,WAAW,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAACC,gBAAgB;QACtD,IAAIH,WAAW,GAAGD,cAAc,EAAE,OAAO,CAAC,CAAC,KACtC,OAAOA,cAAc,GAAGC,WAAW;MAC1C,CAAC;MAAAX,eAAA,oBAEmB,IAAIH,QAAQ,CAACkB,KAAK,CAACC,SAAS,CAAC,CAAC;MAAAhB,eAAA,gCACT,IAAIiB,GAAG,CAAoB,CAAC;MAAAjB,eAAA,4BAChC,IAAIiB,GAAG,CAAgB,CAAC;MAAAjB,eAAA,yBAC3B;QAChCkB,UAAU,EAAExB,kBAAkB,CAACS,OAAO,CAACC,QAAQ,CAACe,WAAW;QAC3DC,OAAO,EAAE1B,kBAAkB,CAACS,OAAO,CAACC,QAAQ,CAACiB,QAAQ;QACrDC,gBAAgB,EAAE5B,kBAAkB,CAACS,OAAO,CAACC,QAAQ,CAACmB;QACtD;MACF,CAAC;MAAAvB,eAAA,wBACkD;QACjDwB,OAAO,EAAE;UACP,GAAG,IAAI,CAACC,cAAc;UACtBjB,SAAS,EAAE,IAAI,IAAI,CAACkB,OAAO,CAAClB,SAAS,EAAE;UACvCmB,YAAY,EAAE9B,QAAQ,CAACkB,KAAK,CAACa,mBAAmB,CAACC,GAAG;UACpDC,YAAY,EAAEjC,QAAQ,CAACkB,KAAK,CAACgB,mBAAmB,CAACC;QACnD,CAAC;QACDC,GAAG,EAAE;UACH,GAAG,IAAI,CAACR,cAAc;UACtBjB,SAAS,EAAE,IAAI,IAAI,CAACkB,OAAO,CAAClB,SAAS,EAAE;UACvCsB,YAAY,EAAEjC,QAAQ,CAACkB,KAAK,CAACmB,eAAe,CAACC,QAAQ;UACrDC,YAAY,EAAEvC,QAAQ,CAACkB,KAAK,CAACsB,eAAe,CAACC;QAC/C,CAAC;QACDC,GAAG,EAAE,CAAC;MACR,CAAC;MAAAvC,eAAA,kBAEiB,YAAY;QAC5B,IAAI,CAACwC,QAAQ,CAAC,WAAW,CAAC;QAC1B,IAAIjD,QAAQ,CAACkD,EAAE,KAAK,KAAK,EAAE;UACzB,MAAM5C,QAAQ,CAACkB,KAAK,CAAC2B,iBAAiB,CAAC;YAAEC,kBAAkB,EAAE,IAAI;YAAEC,oBAAoB,EAAE;UAAK,CAAC,CAAC;QAClG;QAEA,IAAI,IAAI,CAACC,SAAS,CAACC,gBAAgB,EAAE;UACnC,IAAI,CAACD,SAAS,GAAG,IAAIhD,QAAQ,CAACkB,KAAK,CAACC,SAAS,CAAC,CAAC;QACjD;QACA,IAAI,CAAC6B,SAAS,CAACE,yBAAyB,CAAC,GAAG,CAAC;QAC7C,IAAI,CAACF,SAAS,CAACG,0BAA0B,CAAEC,MAAM,IAAK;UACpD,MAAMC,SAAS,GAAGD,MAAM,CAACE,cAAc,IAAI,IAAI,CAACzB,OAAO,CAACpB,WAAW;UACnE,IAAI4C,SAAS,EAAE,IAAI,CAACE,IAAI,CAAC,CAAC;UAC1B,IAAIH,MAAM,CAACI,WAAW,EAAE;YACtB,IAAI,CAACC,qBAAqB,CAACC,OAAO,CAAEC,QAAQ,IAAK;cAC/CA,QAAQ,CAAC;gBAAEC,WAAW,EAAER,MAAM,CAACE,cAAc;gBAAED,SAAS,EAAEA;cAAU,CAAC,CAAC;YACxE,CAAC,CAAC;UACJ;QACF,CAAC,CAAC;QACF,MAAM,IAAI,CAACL,SAAS,CAACa,oBAAoB,CAAC,IAAI,CAACC,aAAa,CAAC;MAC/D,CAAC;MAAA3D,eAAA,mBAEmB4D,KAAwC,IAAK;QAC/D,IAAI,CAACA,KAAK,GAAGA,KAAK;QAClB,IAAI,CAACC,iBAAiB,CAACN,OAAO,CAAEC,QAAQ,IAAK;UAC3CA,QAAQ,CAACI,KAAK,CAAC;QACjB,CAAC,CAAC;MACJ,CAAC;MAAA5D,eAAA,4BAE0B,YAA8B;QACvD,MAAMiD,MAAM,GAAG,MAAMpD,QAAQ,CAACkB,KAAK,CAAC+C,mBAAmB,CAAC,CAAC;QACzD,IAAInE,qBAAqB,CAAC,CAACsD,MAAM,CAAC,CAAC,EAAE;UACnC,OAAO,IAAI;QACb,CAAC,MAAM;UACL,MAAMA,MAAM,GAAG,MAAMpD,QAAQ,CAACkB,KAAK,CAACgD,uBAAuB,CAAC,CAAC;UAC7D,OAAOpE,qBAAqB,CAAC,CAACsD,MAAM,CAAC,CAAC;QACxC;MACF,CAAC;MAAAjD,eAAA,+BAE8BwD,QAA2B,IAAkB;QAC1E,IAAI,CAACF,qBAAqB,CAACU,GAAG,CAACR,QAAQ,CAAC;QACxC,OAAO,MAAM;UACX,IAAI,CAACF,qBAAqB,CAACW,MAAM,CAACT,QAAQ,CAAC;QAC7C,CAAC;MACH,CAAC;MAAAxD,eAAA,2BAE0BwD,QAAuB,IAAkB;QAClE,IAAI,CAACK,iBAAiB,CAACG,GAAG,CAACR,QAAQ,CAAC;QACpC,OAAO,MAAM;UACX,IAAI,CAACK,iBAAiB,CAACI,MAAM,CAACT,QAAQ,CAAC;QACzC,CAAC;MACH,CAAC;MAAAxD,eAAA,iBAEe,YAA2B;QACzC,IAAIR,YAAY,CAAC,IAAI,CAACoE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE;UACnD,IAAI;YACF,MAAM,IAAI,CAACM,OAAO,CAAC,CAAC;YACpB,MAAM,IAAI,CAACrB,SAAS,CAACsB,UAAU,CAAC,CAAC;YAEjC,IAAI5E,QAAQ,CAACkD,EAAE,KAAK,SAAS,EAAE;cAC7B,IAAI,CAAC3B,gBAAgB,GAAGF,IAAI,CAACC,GAAG,CAAC,CAAC;YACpC;YAEA,MAAMuD,GAAG,GAAG,IAAI,CAACvB,SAAS,CAACwB,MAAM,CAAC,CAAC;YACnC,IAAID,GAAG,EAAE,IAAI,CAACA,GAAG,GAAGA,GAAG;YACvB,IAAI,CAAC5B,QAAQ,CAAC,WAAW,CAAC;UAC5B,CAAC,CAAC,OAAO8B,CAAC,EAAE;YACV,IAAI,CAAC9B,QAAQ,CAAC,MAAM,CAAC;YACrB,MAAM8B,CAAC;UACT;QACF;MACF,CAAC;MAAAtE,eAAA,eAEa,YAA2B;QACvC,IAAIR,YAAY,CAAC,IAAI,CAACoE,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE;UAC3C,IAAIrE,QAAQ,CAACkD,EAAE,KAAK,SAAS,EAAE;YAC7B,MAAM8B,MAAM,GAAG,IAAI,CAACC,0BAA0B,CAAC,CAAC;YAChD,IAAID,MAAM,GAAG,CAAC,EAAE,MAAM9E,KAAK,CAAC8E,MAAM,CAAC;UACrC;UAEA,MAAM,IAAI,CAAC1B,SAAS,CAAC4B,kBAAkB,CAAC,CAAC;UACzC,IAAIlF,QAAQ,CAACkD,EAAE,KAAK,KAAK,EAAE;YACzB,MAAM5C,QAAQ,CAACkB,KAAK,CAAC2B,iBAAiB,CAAC;cAAEC,kBAAkB,EAAE,KAAK;cAAEC,oBAAoB,EAAE;YAAM,CAAC,CAAC;UACpG;UACA,IAAI,CAACJ,QAAQ,CAAC,WAAW,CAAC;QAC5B;MACF,CAAC;MAAAxC,eAAA,gBAEc,YAA2B;QACxC,MAAM,IAAI,CAACoD,IAAI,CAAC,CAAC;QACjB,IAAI,CAACgB,GAAG,GAAGnE,SAAS;QACpB,IAAI,CAACqD,qBAAqB,CAACoB,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC7B,SAAS,GAAG,IAAIhD,QAAQ,CAACkB,KAAK,CAACC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAACwB,QAAQ,CAAC,MAAM,CAAC;MACvB,CAAC;IAAA;EACH;EAEA,OAAO,IAAI1C,aAAa,CAAC,CAAC;AAC5B,CAAC;AAED,eAAeF,yBAAyB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Platform","Logger","matchesOneOf","sleep","VoiceMessageConfig","expoBackwardUtils","expoPermissionGranted","BaseAudioRecorderAdapter","constructor","_defineProperty","undefined","minDuration","DEFAULT","RECORDER","MIN_DURATION","maxDuration","MAX_DURATION","extension","EXTENSION","sampleRate","SAMPLE_RATE","bitRate","BIT_RATE","numberOfChannels","CHANNELS","Set","minWaitingTime","elapsedTime","Date","now","_recordStartedAt","state","_stateSubscribers","forEach","callback","_recordingSubscribers","add","delete","uri","LegacyExpoAVRecorderAdapter","avModule","setState","OS","Audio","setAudioModeAsync","allowsRecordingIOS","playsInSilentModeIOS","_recorder","_isDoneRecording","Recording","setProgressUpdateInterval","setOnRecordingStatusUpdate","status","completed","durationMillis","options","stop","isRecording","currentTime","prepareToRecordAsync","_audioOptions","getPermissionsAsync","requestPermissionsAsync","prepare","startAsync","getURI","e","buffer","_getRecorderStopSafeBuffer","stopAndUnloadAsync","clear","android","_audioSettings","audioEncoder","AndroidAudioEncoder","AAC","outputFormat","AndroidOutputFormat","MPEG_4","ios","IOSOutputFormat","MPEG4AAC","audioQuality","IOSAudioQuality","HIGH","web","ExpoAudioRecorderAdapter","audioModule","recorder","recordingUpdateInterval","setInterval","catch","error","warn","clearInterval","allowsRecording","playsInSilentMode","recordingOptions","AudioModule","AudioRecorder","getRecordingPermissionsAsync","requestRecordingPermissionsAsync","_this$recorder","_this$recorder2","setListener","record","removeListener","_this$recorder3","createExpoRecorderService","expoAV","isLegacyAVModule","isAudioModule"],"sources":["createRecorderService.expo.tsx"],"sourcesContent":["import type * as ExpoAudio from 'expo-audio';\nimport type * as ExpoAV from 'expo-av';\nimport { Platform } from 'react-native';\n\nimport { Logger, matchesOneOf, sleep } from '@sendbird/uikit-utils';\n\nimport VoiceMessageConfig from '../libs/VoiceMessageConfig';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoAudioModule } from '../utils/expoBackwardUtils';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type { RecorderServiceInterface, Unsubscribe } from './types';\n\ntype RecordingListener = Parameters<RecorderServiceInterface['addRecordingListener']>[number];\ntype StateListener = Parameters<RecorderServiceInterface['addStateListener']>[number];\ntype Modules = {\n avModule: ExpoAudioModule;\n};\n\ninterface AudioRecorderAdapter {\n requestPermission(): Promise<boolean>;\n record(): Promise<void>;\n stop(): Promise<void>;\n reset(): Promise<void>;\n addRecordingListener(callback: RecordingListener): Unsubscribe;\n addStateListener(callback: StateListener): Unsubscribe;\n convertRecordPath(uri: string): string;\n readonly state: RecorderServiceInterface['state'];\n readonly options: RecorderServiceInterface['options'];\n uri?: string;\n}\n\nabstract class BaseAudioRecorderAdapter implements AudioRecorderAdapter {\n public uri: RecorderServiceInterface['uri'] = undefined;\n public state: RecorderServiceInterface['state'] = 'idle';\n public options: RecorderServiceInterface['options'] = {\n minDuration: VoiceMessageConfig.DEFAULT.RECORDER.MIN_DURATION,\n maxDuration: VoiceMessageConfig.DEFAULT.RECORDER.MAX_DURATION,\n extension: VoiceMessageConfig.DEFAULT.RECORDER.EXTENSION,\n };\n\n protected readonly _audioSettings = {\n sampleRate: VoiceMessageConfig.DEFAULT.RECORDER.SAMPLE_RATE,\n bitRate: VoiceMessageConfig.DEFAULT.RECORDER.BIT_RATE,\n numberOfChannels: VoiceMessageConfig.DEFAULT.RECORDER.CHANNELS,\n // encoding: mpeg4_aac\n };\n protected readonly _recordingSubscribers = new Set<RecordingListener>();\n protected readonly _stateSubscribers = new Set<StateListener>();\n\n // NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs\n protected _recordStartedAt = 0;\n protected _getRecorderStopSafeBuffer = () => {\n const minWaitingTime = 500;\n const elapsedTime = Date.now() - this._recordStartedAt;\n if (elapsedTime > minWaitingTime) return 0;\n else return minWaitingTime - elapsedTime;\n };\n protected setState = (state: RecorderServiceInterface['state']) => {\n this.state = state;\n this._stateSubscribers.forEach((callback) => {\n callback(state);\n });\n };\n\n public addRecordingListener = (callback: RecordingListener): Unsubscribe => {\n this._recordingSubscribers.add(callback);\n return () => {\n this._recordingSubscribers.delete(callback);\n };\n };\n\n public addStateListener = (callback: StateListener): Unsubscribe => {\n this._stateSubscribers.add(callback);\n return () => {\n this._stateSubscribers.delete(callback);\n };\n };\n\n public convertRecordPath = (uri: string): string => {\n return uri;\n };\n\n abstract requestPermission(): Promise<boolean>;\n abstract record(): Promise<void>;\n abstract stop(): Promise<void>;\n abstract reset(): Promise<void>;\n}\n\nclass LegacyExpoAVRecorderAdapter extends BaseAudioRecorderAdapter {\n private readonly avModule: typeof ExpoAV;\n\n private _recorder: ExpoAV.Audio.Recording;\n private readonly _audioOptions: ExpoAV.Audio.RecordingOptions;\n\n constructor(avModule: typeof ExpoAV) {\n super();\n this.avModule = avModule;\n this._recorder = new avModule.Audio.Recording();\n this._audioOptions = {\n android: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,\n outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4,\n },\n ios: {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,\n audioQuality: avModule.Audio.IOSAudioQuality.HIGH,\n },\n web: {},\n };\n }\n\n private prepare = async () => {\n this.setState('preparing');\n if (Platform.OS === 'ios') {\n await this.avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: true, playsInSilentModeIOS: true });\n }\n\n if (this._recorder._isDoneRecording) {\n this._recorder = new this.avModule.Audio.Recording();\n }\n this._recorder.setProgressUpdateInterval(100);\n this._recorder.setOnRecordingStatusUpdate((status) => {\n const completed = status.durationMillis >= this.options.maxDuration;\n if (completed) this.stop();\n if (status.isRecording) {\n this._recordingSubscribers.forEach((callback) => {\n callback({ currentTime: status.durationMillis, completed: completed });\n });\n }\n });\n await this._recorder.prepareToRecordAsync(this._audioOptions);\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await this.avModule.Audio.getPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await this.avModule.Audio.requestPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public record = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n await this.prepare();\n await this._recorder.startAsync();\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n const uri = this._recorder.getURI();\n if (uri) this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await this._recorder.stopAndUnloadAsync();\n if (Platform.OS === 'ios') {\n await this.avModule.Audio.setAudioModeAsync({ allowsRecordingIOS: false, playsInSilentModeIOS: false });\n }\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.uri = undefined;\n this._recordingSubscribers.clear();\n this._recorder = new this.avModule.Audio.Recording();\n this.setState('idle');\n };\n}\n\nclass ExpoAudioRecorderAdapter extends BaseAudioRecorderAdapter {\n private readonly audioModule: typeof ExpoAudio;\n private recorder: ExpoAudio.AudioRecorder | null = null;\n private recordingUpdateInterval: NodeJS.Timeout | null = null;\n\n constructor(audioModule: typeof ExpoAudio) {\n super();\n this.audioModule = audioModule;\n }\n\n private setListener = () => {\n if (!this.recorder) return;\n\n this.recordingUpdateInterval = setInterval(() => {\n if (this.recorder && this.recorder.isRecording) {\n const currentTime = this.recorder.currentTime * 1000;\n const completed = currentTime >= this.options.maxDuration;\n\n if (completed) {\n this.stop().catch((error) => {\n Logger.warn('[RecorderService.Expo] Failed to stop in update interval', error);\n });\n }\n\n this._recordingSubscribers.forEach((callback) => {\n callback({ currentTime, completed });\n });\n }\n }, 100);\n };\n\n private removeListener = () => {\n if (this.recordingUpdateInterval) {\n clearInterval(this.recordingUpdateInterval);\n this.recordingUpdateInterval = null;\n }\n };\n\n private prepare = async () => {\n this.setState('preparing');\n if (Platform.OS === 'ios') {\n await this.audioModule.setAudioModeAsync({\n allowsRecording: true,\n playsInSilentMode: true,\n });\n }\n\n const recordingOptions = {\n ...this._audioSettings,\n extension: `.${this.options.extension}`,\n };\n\n this.recorder = new this.audioModule.AudioModule.AudioRecorder(recordingOptions);\n await this.recorder.prepareToRecordAsync();\n };\n\n public requestPermission = async (): Promise<boolean> => {\n const status = await this.audioModule.getRecordingPermissionsAsync();\n if (expoPermissionGranted([status])) {\n return true;\n } else {\n const status = await this.audioModule.requestRecordingPermissionsAsync();\n return expoPermissionGranted([status]);\n }\n };\n\n public record = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['idle', 'completed'])) {\n try {\n await this.prepare();\n this.setListener();\n this.recorder?.record();\n\n if (Platform.OS === 'android') {\n this._recordStartedAt = Date.now();\n }\n\n const uri = this.recorder?.uri;\n if (uri) this.uri = uri;\n this.setState('recording');\n } catch (e) {\n this.setState('idle');\n this.removeListener();\n throw e;\n }\n }\n };\n\n public stop = async (): Promise<void> => {\n if (matchesOneOf(this.state, ['recording'])) {\n if (Platform.OS === 'android') {\n const buffer = this._getRecorderStopSafeBuffer();\n if (buffer > 0) await sleep(buffer);\n }\n\n await this.recorder?.stop();\n this.removeListener();\n if (Platform.OS === 'ios') {\n await this.audioModule.setAudioModeAsync({\n allowsRecording: false,\n playsInSilentMode: false,\n });\n }\n this.setState('completed');\n }\n };\n\n public reset = async (): Promise<void> => {\n await this.stop();\n this.recorder = null;\n this.uri = undefined;\n this._recordingSubscribers.clear();\n this._stateSubscribers.clear();\n this.setState('idle');\n };\n}\n\nconst createExpoRecorderService = ({ avModule }: Modules): RecorderServiceInterface => {\n if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {\n Logger.warn(\n '[RecorderService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-audio.',\n );\n }\n\n return expoBackwardUtils.expoAV.isAudioModule(avModule)\n ? new ExpoAudioRecorderAdapter(avModule)\n : new LegacyExpoAVRecorderAdapter(avModule);\n};\n\nexport default createExpoRecorderService;\n"],"mappings":"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","ignoreList":[]}
|