@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
|
@@ -7,150 +7,271 @@ exports.default = void 0;
|
|
|
7
7
|
var _reactNative = require("react-native");
|
|
8
8
|
var _uikitUtils = require("@sendbird/uikit-utils");
|
|
9
9
|
var _VoiceMessageConfig = _interopRequireDefault(require("../libs/VoiceMessageConfig"));
|
|
10
|
+
var _expoBackwardUtils = _interopRequireDefault(require("../utils/expoBackwardUtils"));
|
|
10
11
|
var _expoPermissionGranted = _interopRequireDefault(require("../utils/expoPermissionGranted"));
|
|
11
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
13
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
13
14
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
14
15
|
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); }
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
class BaseAudioRecorderAdapter {
|
|
17
|
+
constructor() {
|
|
18
|
+
_defineProperty(this, "uri", undefined);
|
|
19
|
+
_defineProperty(this, "state", 'idle');
|
|
20
|
+
_defineProperty(this, "options", {
|
|
21
|
+
minDuration: _VoiceMessageConfig.default.DEFAULT.RECORDER.MIN_DURATION,
|
|
22
|
+
maxDuration: _VoiceMessageConfig.default.DEFAULT.RECORDER.MAX_DURATION,
|
|
23
|
+
extension: _VoiceMessageConfig.default.DEFAULT.RECORDER.EXTENSION
|
|
24
|
+
});
|
|
25
|
+
_defineProperty(this, "_audioSettings", {
|
|
26
|
+
sampleRate: _VoiceMessageConfig.default.DEFAULT.RECORDER.SAMPLE_RATE,
|
|
27
|
+
bitRate: _VoiceMessageConfig.default.DEFAULT.RECORDER.BIT_RATE,
|
|
28
|
+
numberOfChannels: _VoiceMessageConfig.default.DEFAULT.RECORDER.CHANNELS
|
|
29
|
+
// encoding: mpeg4_aac
|
|
30
|
+
});
|
|
31
|
+
_defineProperty(this, "_recordingSubscribers", new Set());
|
|
32
|
+
_defineProperty(this, "_stateSubscribers", new Set());
|
|
33
|
+
// NOTE: In Android, even when startRecorder() is awaited, if stop() is executed immediately afterward, an error occurs
|
|
34
|
+
_defineProperty(this, "_recordStartedAt", 0);
|
|
35
|
+
_defineProperty(this, "_getRecorderStopSafeBuffer", () => {
|
|
36
|
+
const minWaitingTime = 500;
|
|
37
|
+
const elapsedTime = Date.now() - this._recordStartedAt;
|
|
38
|
+
if (elapsedTime > minWaitingTime) return 0;else return minWaitingTime - elapsedTime;
|
|
39
|
+
});
|
|
40
|
+
_defineProperty(this, "setState", state => {
|
|
41
|
+
this.state = state;
|
|
42
|
+
this._stateSubscribers.forEach(callback => {
|
|
43
|
+
callback(state);
|
|
26
44
|
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
});
|
|
46
|
+
_defineProperty(this, "addRecordingListener", callback => {
|
|
47
|
+
this._recordingSubscribers.add(callback);
|
|
48
|
+
return () => {
|
|
49
|
+
this._recordingSubscribers.delete(callback);
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
_defineProperty(this, "addStateListener", callback => {
|
|
53
|
+
this._stateSubscribers.add(callback);
|
|
54
|
+
return () => {
|
|
55
|
+
this._stateSubscribers.delete(callback);
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
_defineProperty(this, "convertRecordPath", uri => {
|
|
59
|
+
return uri;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
class LegacyExpoAVRecorderAdapter extends BaseAudioRecorderAdapter {
|
|
64
|
+
constructor(avModule) {
|
|
65
|
+
super();
|
|
66
|
+
_defineProperty(this, "avModule", void 0);
|
|
67
|
+
_defineProperty(this, "_recorder", void 0);
|
|
68
|
+
_defineProperty(this, "_audioOptions", void 0);
|
|
69
|
+
_defineProperty(this, "prepare", async () => {
|
|
70
|
+
this.setState('preparing');
|
|
71
|
+
if (_reactNative.Platform.OS === 'ios') {
|
|
72
|
+
await this.avModule.Audio.setAudioModeAsync({
|
|
73
|
+
allowsRecordingIOS: true,
|
|
74
|
+
playsInSilentModeIOS: true
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (this._recorder._isDoneRecording) {
|
|
78
|
+
this._recorder = new this.avModule.Audio.Recording();
|
|
79
|
+
}
|
|
80
|
+
this._recorder.setProgressUpdateInterval(100);
|
|
81
|
+
this._recorder.setOnRecordingStatusUpdate(status => {
|
|
82
|
+
const completed = status.durationMillis >= this.options.maxDuration;
|
|
83
|
+
if (completed) this.stop();
|
|
84
|
+
if (status.isRecording) {
|
|
85
|
+
this._recordingSubscribers.forEach(callback => {
|
|
86
|
+
callback({
|
|
87
|
+
currentTime: status.durationMillis,
|
|
88
|
+
completed: completed
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
57
92
|
});
|
|
58
|
-
|
|
59
|
-
|
|
93
|
+
await this._recorder.prepareToRecordAsync(this._audioOptions);
|
|
94
|
+
});
|
|
95
|
+
_defineProperty(this, "requestPermission", async () => {
|
|
96
|
+
const status = await this.avModule.Audio.getPermissionsAsync();
|
|
97
|
+
if ((0, _expoPermissionGranted.default)([status])) {
|
|
98
|
+
return true;
|
|
99
|
+
} else {
|
|
100
|
+
const status = await this.avModule.Audio.requestPermissionsAsync();
|
|
101
|
+
return (0, _expoPermissionGranted.default)([status]);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
_defineProperty(this, "record", async () => {
|
|
105
|
+
if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'completed'])) {
|
|
106
|
+
try {
|
|
107
|
+
await this.prepare();
|
|
108
|
+
await this._recorder.startAsync();
|
|
109
|
+
if (_reactNative.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
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
_defineProperty(this, "stop", async () => {
|
|
122
|
+
if ((0, _uikitUtils.matchesOneOf)(this.state, ['recording'])) {
|
|
123
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
124
|
+
const buffer = this._getRecorderStopSafeBuffer();
|
|
125
|
+
if (buffer > 0) await (0, _uikitUtils.sleep)(buffer);
|
|
126
|
+
}
|
|
127
|
+
await this._recorder.stopAndUnloadAsync();
|
|
60
128
|
if (_reactNative.Platform.OS === 'ios') {
|
|
61
|
-
await avModule.Audio.setAudioModeAsync({
|
|
62
|
-
allowsRecordingIOS:
|
|
63
|
-
playsInSilentModeIOS:
|
|
129
|
+
await this.avModule.Audio.setAudioModeAsync({
|
|
130
|
+
allowsRecordingIOS: false,
|
|
131
|
+
playsInSilentModeIOS: false
|
|
64
132
|
});
|
|
65
133
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
134
|
+
this.setState('completed');
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
_defineProperty(this, "reset", async () => {
|
|
138
|
+
await this.stop();
|
|
139
|
+
this.uri = undefined;
|
|
140
|
+
this._recordingSubscribers.clear();
|
|
141
|
+
this._recorder = new this.avModule.Audio.Recording();
|
|
142
|
+
this.setState('idle');
|
|
143
|
+
});
|
|
144
|
+
this.avModule = avModule;
|
|
145
|
+
this._recorder = new avModule.Audio.Recording();
|
|
146
|
+
this._audioOptions = {
|
|
147
|
+
android: {
|
|
148
|
+
...this._audioSettings,
|
|
149
|
+
extension: `.${this.options.extension}`,
|
|
150
|
+
audioEncoder: avModule.Audio.AndroidAudioEncoder.AAC,
|
|
151
|
+
outputFormat: avModule.Audio.AndroidOutputFormat.MPEG_4
|
|
152
|
+
},
|
|
153
|
+
ios: {
|
|
154
|
+
...this._audioSettings,
|
|
155
|
+
extension: `.${this.options.extension}`,
|
|
156
|
+
outputFormat: avModule.Audio.IOSOutputFormat.MPEG4AAC,
|
|
157
|
+
audioQuality: avModule.Audio.IOSAudioQuality.HIGH
|
|
158
|
+
},
|
|
159
|
+
web: {}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
class ExpoAudioRecorderAdapter extends BaseAudioRecorderAdapter {
|
|
164
|
+
constructor(audioModule) {
|
|
165
|
+
super();
|
|
166
|
+
_defineProperty(this, "audioModule", void 0);
|
|
167
|
+
_defineProperty(this, "recorder", null);
|
|
168
|
+
_defineProperty(this, "recordingUpdateInterval", null);
|
|
169
|
+
_defineProperty(this, "setListener", () => {
|
|
170
|
+
if (!this.recorder) return;
|
|
171
|
+
this.recordingUpdateInterval = setInterval(() => {
|
|
172
|
+
if (this.recorder && this.recorder.isRecording) {
|
|
173
|
+
const currentTime = this.recorder.currentTime * 1000;
|
|
174
|
+
const completed = currentTime >= this.options.maxDuration;
|
|
175
|
+
if (completed) {
|
|
176
|
+
this.stop().catch(error => {
|
|
177
|
+
_uikitUtils.Logger.warn('[RecorderService.Expo] Failed to stop in update interval', error);
|
|
79
178
|
});
|
|
80
179
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
callback(state);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
_defineProperty(this, "requestPermission", async () => {
|
|
91
|
-
const status = await avModule.Audio.getPermissionsAsync();
|
|
92
|
-
if ((0, _expoPermissionGranted.default)([status])) {
|
|
93
|
-
return true;
|
|
94
|
-
} else {
|
|
95
|
-
const status = await avModule.Audio.requestPermissionsAsync();
|
|
96
|
-
return (0, _expoPermissionGranted.default)([status]);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
_defineProperty(this, "addRecordingListener", callback => {
|
|
100
|
-
this._recordingSubscribers.add(callback);
|
|
101
|
-
return () => {
|
|
102
|
-
this._recordingSubscribers.delete(callback);
|
|
103
|
-
};
|
|
104
|
-
});
|
|
105
|
-
_defineProperty(this, "addStateListener", callback => {
|
|
106
|
-
this._stateSubscribers.add(callback);
|
|
107
|
-
return () => {
|
|
108
|
-
this._stateSubscribers.delete(callback);
|
|
109
|
-
};
|
|
110
|
-
});
|
|
111
|
-
_defineProperty(this, "record", async () => {
|
|
112
|
-
if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'completed'])) {
|
|
113
|
-
try {
|
|
114
|
-
await this.prepare();
|
|
115
|
-
await this._recorder.startAsync();
|
|
116
|
-
if (_reactNative.Platform.OS === 'android') {
|
|
117
|
-
this._recordStartedAt = Date.now();
|
|
118
|
-
}
|
|
119
|
-
const uri = this._recorder.getURI();
|
|
120
|
-
if (uri) this.uri = uri;
|
|
121
|
-
this.setState('recording');
|
|
122
|
-
} catch (e) {
|
|
123
|
-
this.setState('idle');
|
|
124
|
-
throw e;
|
|
125
|
-
}
|
|
180
|
+
this._recordingSubscribers.forEach(callback => {
|
|
181
|
+
callback({
|
|
182
|
+
currentTime,
|
|
183
|
+
completed
|
|
184
|
+
});
|
|
185
|
+
});
|
|
126
186
|
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
|
|
187
|
+
}, 100);
|
|
188
|
+
});
|
|
189
|
+
_defineProperty(this, "removeListener", () => {
|
|
190
|
+
if (this.recordingUpdateInterval) {
|
|
191
|
+
clearInterval(this.recordingUpdateInterval);
|
|
192
|
+
this.recordingUpdateInterval = null;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
_defineProperty(this, "prepare", async () => {
|
|
196
|
+
this.setState('preparing');
|
|
197
|
+
if (_reactNative.Platform.OS === 'ios') {
|
|
198
|
+
await this.audioModule.setAudioModeAsync({
|
|
199
|
+
allowsRecording: true,
|
|
200
|
+
playsInSilentMode: true
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
const recordingOptions = {
|
|
204
|
+
...this._audioSettings,
|
|
205
|
+
extension: `.${this.options.extension}`
|
|
206
|
+
};
|
|
207
|
+
this.recorder = new this.audioModule.AudioModule.AudioRecorder(recordingOptions);
|
|
208
|
+
await this.recorder.prepareToRecordAsync();
|
|
209
|
+
});
|
|
210
|
+
_defineProperty(this, "requestPermission", async () => {
|
|
211
|
+
const status = await this.audioModule.getRecordingPermissionsAsync();
|
|
212
|
+
if ((0, _expoPermissionGranted.default)([status])) {
|
|
213
|
+
return true;
|
|
214
|
+
} else {
|
|
215
|
+
const status = await this.audioModule.requestRecordingPermissionsAsync();
|
|
216
|
+
return (0, _expoPermissionGranted.default)([status]);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
_defineProperty(this, "record", async () => {
|
|
220
|
+
if ((0, _uikitUtils.matchesOneOf)(this.state, ['idle', 'completed'])) {
|
|
221
|
+
try {
|
|
222
|
+
var _this$recorder, _this$recorder2;
|
|
223
|
+
await this.prepare();
|
|
224
|
+
this.setListener();
|
|
225
|
+
(_this$recorder = this.recorder) === null || _this$recorder === void 0 || _this$recorder.record();
|
|
130
226
|
if (_reactNative.Platform.OS === 'android') {
|
|
131
|
-
|
|
132
|
-
if (buffer > 0) await (0, _uikitUtils.sleep)(buffer);
|
|
133
|
-
}
|
|
134
|
-
await this._recorder.stopAndUnloadAsync();
|
|
135
|
-
if (_reactNative.Platform.OS === 'ios') {
|
|
136
|
-
await avModule.Audio.setAudioModeAsync({
|
|
137
|
-
allowsRecordingIOS: false,
|
|
138
|
-
playsInSilentModeIOS: false
|
|
139
|
-
});
|
|
227
|
+
this._recordStartedAt = Date.now();
|
|
140
228
|
}
|
|
141
|
-
this.
|
|
229
|
+
const uri = (_this$recorder2 = this.recorder) === null || _this$recorder2 === void 0 ? void 0 : _this$recorder2.uri;
|
|
230
|
+
if (uri) this.uri = uri;
|
|
231
|
+
this.setState('recording');
|
|
232
|
+
} catch (e) {
|
|
233
|
+
this.setState('idle');
|
|
234
|
+
this.removeListener();
|
|
235
|
+
throw e;
|
|
142
236
|
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
_defineProperty(this, "stop", async () => {
|
|
240
|
+
if ((0, _uikitUtils.matchesOneOf)(this.state, ['recording'])) {
|
|
241
|
+
var _this$recorder3;
|
|
242
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
243
|
+
const buffer = this._getRecorderStopSafeBuffer();
|
|
244
|
+
if (buffer > 0) await (0, _uikitUtils.sleep)(buffer);
|
|
245
|
+
}
|
|
246
|
+
await ((_this$recorder3 = this.recorder) === null || _this$recorder3 === void 0 ? void 0 : _this$recorder3.stop());
|
|
247
|
+
this.removeListener();
|
|
248
|
+
if (_reactNative.Platform.OS === 'ios') {
|
|
249
|
+
await this.audioModule.setAudioModeAsync({
|
|
250
|
+
allowsRecording: false,
|
|
251
|
+
playsInSilentMode: false
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
this.setState('completed');
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
_defineProperty(this, "reset", async () => {
|
|
258
|
+
await this.stop();
|
|
259
|
+
this.recorder = null;
|
|
260
|
+
this.uri = undefined;
|
|
261
|
+
this._recordingSubscribers.clear();
|
|
262
|
+
this._stateSubscribers.clear();
|
|
263
|
+
this.setState('idle');
|
|
264
|
+
});
|
|
265
|
+
this.audioModule = audioModule;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const createExpoRecorderService = ({
|
|
269
|
+
avModule
|
|
270
|
+
}) => {
|
|
271
|
+
if (_expoBackwardUtils.default.expoAV.isLegacyAVModule(avModule)) {
|
|
272
|
+
_uikitUtils.Logger.warn('[RecorderService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-audio.');
|
|
152
273
|
}
|
|
153
|
-
return new
|
|
274
|
+
return _expoBackwardUtils.default.expoAV.isAudioModule(avModule) ? new ExpoAudioRecorderAdapter(avModule) : new LegacyExpoAVRecorderAdapter(avModule);
|
|
154
275
|
};
|
|
155
276
|
var _default = exports.default = createExpoRecorderService;
|
|
156
277
|
//# sourceMappingURL=createRecorderService.expo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_uikitUtils","_VoiceMessageConfig","_interopRequireDefault","_expoPermissionGranted","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","createExpoRecorderService","avModule","VoiceRecorder","constructor","undefined","minDuration","VoiceMessageConfig","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","Platform","OS","setAudioModeAsync","allowsRecordingIOS","playsInSilentModeIOS","_recorder","_isDoneRecording","setProgressUpdateInterval","setOnRecordingStatusUpdate","status","completed","durationMillis","stop","isRecording","_recordingSubscribers","forEach","callback","currentTime","prepareToRecordAsync","_audioOptions","state","_stateSubscribers","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","add","delete","matchesOneOf","prepare","startAsync","uri","getURI","buffer","_getRecorderStopSafeBuffer","sleep","stopAndUnloadAsync","clear","_default","exports"],"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":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_uikitUtils","_VoiceMessageConfig","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","BaseAudioRecorderAdapter","constructor","undefined","minDuration","VoiceMessageConfig","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","Platform","OS","Audio","setAudioModeAsync","allowsRecordingIOS","playsInSilentModeIOS","_recorder","_isDoneRecording","Recording","setProgressUpdateInterval","setOnRecordingStatusUpdate","status","completed","durationMillis","options","stop","isRecording","currentTime","prepareToRecordAsync","_audioOptions","getPermissionsAsync","expoPermissionGranted","requestPermissionsAsync","matchesOneOf","prepare","startAsync","getURI","buffer","_getRecorderStopSafeBuffer","sleep","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","Logger","warn","clearInterval","allowsRecording","playsInSilentMode","recordingOptions","AudioModule","AudioRecorder","getRecordingPermissionsAsync","requestRecordingPermissionsAsync","_this$recorder","_this$recorder2","setListener","record","removeListener","_this$recorder3","createExpoRecorderService","expoBackwardUtils","expoAV","isLegacyAVModule","isAudioModule","_default","exports"],"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":[]}
|