capacitor-voice-recorder-wav-stereo 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CapacitorVoiceRecorderWavStereo.podspec +17 -0
- package/README.md +213 -0
- package/android/build.gradle +58 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/com/tchvu3/capacitorvoicerecorder/CurrentRecordingStatus.java +7 -0
- package/android/src/main/java/com/tchvu3/capacitorvoicerecorder/CustomMediaRecorder.java +187 -0
- package/android/src/main/java/com/tchvu3/capacitorvoicerecorder/Messages.java +15 -0
- package/android/src/main/java/com/tchvu3/capacitorvoicerecorder/NotSupportedOsVersion.java +4 -0
- package/android/src/main/java/com/tchvu3/capacitorvoicerecorder/RecordData.java +51 -0
- package/android/src/main/java/com/tchvu3/capacitorvoicerecorder/ResponseGenerator.java +37 -0
- package/android/src/main/java/com/tchvu3/capacitorvoicerecorder/VoiceRecorder.java +217 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/dist/docs.json +174 -0
- package/dist/esm/VoiceRecorderImpl.d.ts +19 -0
- package/dist/esm/VoiceRecorderImpl.js +172 -0
- package/dist/esm/VoiceRecorderImpl.js.map +1 -0
- package/dist/esm/definitions.d.ts +24 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/predefined-web-responses.d.ts +12 -0
- package/dist/esm/predefined-web-responses.js +12 -0
- package/dist/esm/predefined-web-responses.js.map +1 -0
- package/dist/esm/web.d.ts +13 -0
- package/dist/esm/web.js +33 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +228 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +230 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Plugin/CurrentRecordingStatus.swift +9 -0
- package/ios/Plugin/CustomMediaRecorder.swift +82 -0
- package/ios/Plugin/Info.plist +24 -0
- package/ios/Plugin/Messages.swift +15 -0
- package/ios/Plugin/RecordData.swift +17 -0
- package/ios/Plugin/ResponseGenerator.swift +28 -0
- package/ios/Plugin/VoiceRecorder.swift +130 -0
- package/ios/Plugin/VoiceRecorderPlugin.h +10 -0
- package/ios/Plugin/VoiceRecorderPlugin.m +15 -0
- package/package.json +92 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GenericResponse } from './definitions';
|
|
2
|
+
export declare const successResponse: () => GenericResponse;
|
|
3
|
+
export declare const failureResponse: () => GenericResponse;
|
|
4
|
+
export declare const missingPermissionError: () => Error;
|
|
5
|
+
export declare const alreadyRecordingError: () => Error;
|
|
6
|
+
export declare const microphoneBeingUsedError: () => Error;
|
|
7
|
+
export declare const deviceCannotVoiceRecordError: () => Error;
|
|
8
|
+
export declare const failedToRecordError: () => Error;
|
|
9
|
+
export declare const emptyRecordingError: () => Error;
|
|
10
|
+
export declare const recordingHasNotStartedError: () => Error;
|
|
11
|
+
export declare const failedToFetchRecordingError: () => Error;
|
|
12
|
+
export declare const couldNotQueryPermissionStatusError: () => Error;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const successResponse = () => ({ value: true });
|
|
2
|
+
export const failureResponse = () => ({ value: false });
|
|
3
|
+
export const missingPermissionError = () => new Error('MISSING_PERMISSION');
|
|
4
|
+
export const alreadyRecordingError = () => new Error('ALREADY_RECORDING');
|
|
5
|
+
export const microphoneBeingUsedError = () => new Error('MICROPHONE_BEING_USED');
|
|
6
|
+
export const deviceCannotVoiceRecordError = () => new Error('DEVICE_CANNOT_VOICE_RECORD');
|
|
7
|
+
export const failedToRecordError = () => new Error('FAILED_TO_RECORD');
|
|
8
|
+
export const emptyRecordingError = () => new Error('EMPTY_RECORDING');
|
|
9
|
+
export const recordingHasNotStartedError = () => new Error('RECORDING_HAS_NOT_STARTED');
|
|
10
|
+
export const failedToFetchRecordingError = () => new Error('FAILED_TO_FETCH_RECORDING');
|
|
11
|
+
export const couldNotQueryPermissionStatusError = () => new Error('COULD_NOT_QUERY_PERMISSION_STATUS');
|
|
12
|
+
//# sourceMappingURL=predefined-web-responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predefined-web-responses.js","sourceRoot":"","sources":["../../src/predefined-web-responses.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,GAAoB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAoB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAEzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;AACxF,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;AACjG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC/F,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAE/F,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC","sourcesContent":["import type { GenericResponse } from './definitions';\r\n\r\nexport const successResponse = (): GenericResponse => ({ value: true });\r\nexport const failureResponse = (): GenericResponse => ({ value: false });\r\n\r\nexport const missingPermissionError = (): Error => new Error('MISSING_PERMISSION');\r\nexport const alreadyRecordingError = (): Error => new Error('ALREADY_RECORDING');\r\nexport const microphoneBeingUsedError = (): Error => new Error('MICROPHONE_BEING_USED');\r\nexport const deviceCannotVoiceRecordError = (): Error => new Error('DEVICE_CANNOT_VOICE_RECORD');\r\nexport const failedToRecordError = (): Error => new Error('FAILED_TO_RECORD');\r\nexport const emptyRecordingError = (): Error => new Error('EMPTY_RECORDING');\r\n\r\nexport const recordingHasNotStartedError = (): Error => new Error('RECORDING_HAS_NOT_STARTED');\r\nexport const failedToFetchRecordingError = (): Error => new Error('FAILED_TO_FETCH_RECORDING');\r\n\r\nexport const couldNotQueryPermissionStatusError = (): Error => new Error('COULD_NOT_QUERY_PERMISSION_STATUS');\r\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { WebPlugin } from '@capacitor/core';
|
|
2
|
+
import type { CurrentRecordingStatus, GenericResponse, RecordingData, VoiceRecorderPlugin } from './definitions';
|
|
3
|
+
export declare class VoiceRecorderWeb extends WebPlugin implements VoiceRecorderPlugin {
|
|
4
|
+
private voiceRecorderInstance;
|
|
5
|
+
canDeviceVoiceRecord(): Promise<GenericResponse>;
|
|
6
|
+
hasAudioRecordingPermission(): Promise<GenericResponse>;
|
|
7
|
+
requestAudioRecordingPermission(): Promise<GenericResponse>;
|
|
8
|
+
startRecording(): Promise<GenericResponse>;
|
|
9
|
+
stopRecording(): Promise<RecordingData>;
|
|
10
|
+
pauseRecording(): Promise<GenericResponse>;
|
|
11
|
+
resumeRecording(): Promise<GenericResponse>;
|
|
12
|
+
getCurrentStatus(): Promise<CurrentRecordingStatus>;
|
|
13
|
+
}
|
package/dist/esm/web.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { WebPlugin } from '@capacitor/core';
|
|
2
|
+
import { VoiceRecorderImpl } from './VoiceRecorderImpl';
|
|
3
|
+
export class VoiceRecorderWeb extends WebPlugin {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.voiceRecorderInstance = new VoiceRecorderImpl();
|
|
7
|
+
}
|
|
8
|
+
canDeviceVoiceRecord() {
|
|
9
|
+
return VoiceRecorderImpl.canDeviceVoiceRecord();
|
|
10
|
+
}
|
|
11
|
+
hasAudioRecordingPermission() {
|
|
12
|
+
return VoiceRecorderImpl.hasAudioRecordingPermission();
|
|
13
|
+
}
|
|
14
|
+
requestAudioRecordingPermission() {
|
|
15
|
+
return VoiceRecorderImpl.requestAudioRecordingPermission();
|
|
16
|
+
}
|
|
17
|
+
startRecording() {
|
|
18
|
+
return this.voiceRecorderInstance.startRecording();
|
|
19
|
+
}
|
|
20
|
+
stopRecording() {
|
|
21
|
+
return this.voiceRecorderInstance.stopRecording();
|
|
22
|
+
}
|
|
23
|
+
pauseRecording() {
|
|
24
|
+
return this.voiceRecorderInstance.pauseRecording();
|
|
25
|
+
}
|
|
26
|
+
resumeRecording() {
|
|
27
|
+
return this.voiceRecorderInstance.resumeRecording();
|
|
28
|
+
}
|
|
29
|
+
getCurrentStatus() {
|
|
30
|
+
return this.voiceRecorderInstance.getCurrentStatus();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAGtD,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAA/C;;QAEY,0BAAqB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAkC5D,CAAC;IAhCU,oBAAoB;QACvB,OAAO,iBAAiB,CAAC,oBAAoB,EAAE,CAAC;IACpD,CAAC;IAEM,2BAA2B;QAC9B,OAAO,iBAAiB,CAAC,2BAA2B,EAAE,CAAC;IAC3D,CAAC;IAEM,+BAA+B;QAClC,OAAO,iBAAiB,CAAC,+BAA+B,EAAE,CAAC;IAC/D,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,CAAC;IACvD,CAAC;IAEM,aAAa;QAChB,OAAO,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,CAAC;IACtD,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,CAAC;IACvD,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,CAAC;IACxD,CAAC;IAEM,gBAAgB;QACnB,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,CAAC;IACzD,CAAC;CAEJ","sourcesContent":["import {WebPlugin} from '@capacitor/core';\r\n\r\nimport {VoiceRecorderImpl} from './VoiceRecorderImpl';\r\nimport type {CurrentRecordingStatus, GenericResponse, RecordingData, VoiceRecorderPlugin} from './definitions';\r\n\r\nexport class VoiceRecorderWeb extends WebPlugin implements VoiceRecorderPlugin {\r\n\r\n private voiceRecorderInstance = new VoiceRecorderImpl();\r\n\r\n public canDeviceVoiceRecord(): Promise<GenericResponse> {\r\n return VoiceRecorderImpl.canDeviceVoiceRecord();\r\n }\r\n\r\n public hasAudioRecordingPermission(): Promise<GenericResponse> {\r\n return VoiceRecorderImpl.hasAudioRecordingPermission();\r\n }\r\n\r\n public requestAudioRecordingPermission(): Promise<GenericResponse> {\r\n return VoiceRecorderImpl.requestAudioRecordingPermission();\r\n }\r\n\r\n public startRecording(): Promise<GenericResponse> {\r\n return this.voiceRecorderInstance.startRecording();\r\n }\r\n\r\n public stopRecording(): Promise<RecordingData> {\r\n return this.voiceRecorderInstance.stopRecording();\r\n }\r\n\r\n public pauseRecording(): Promise<GenericResponse> {\r\n return this.voiceRecorderInstance.pauseRecording();\r\n }\r\n\r\n public resumeRecording(): Promise<GenericResponse> {\r\n return this.voiceRecorderInstance.resumeRecording();\r\n }\r\n\r\n public getCurrentStatus(): Promise<CurrentRecordingStatus> {\r\n return this.voiceRecorderInstance.getCurrentStatus();\r\n }\r\n\r\n}\r\n"]}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@capacitor/core');
|
|
4
|
+
var getBlobDuration = require('get-blob-duration');
|
|
5
|
+
|
|
6
|
+
const VoiceRecorder = core.registerPlugin('VoiceRecorder', {
|
|
7
|
+
web: () => Promise.resolve().then(function () { return web; }).then(m => new m.VoiceRecorderWeb()),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
const successResponse = () => ({ value: true });
|
|
11
|
+
const failureResponse = () => ({ value: false });
|
|
12
|
+
const missingPermissionError = () => new Error('MISSING_PERMISSION');
|
|
13
|
+
const alreadyRecordingError = () => new Error('ALREADY_RECORDING');
|
|
14
|
+
const deviceCannotVoiceRecordError = () => new Error('DEVICE_CANNOT_VOICE_RECORD');
|
|
15
|
+
const failedToRecordError = () => new Error('FAILED_TO_RECORD');
|
|
16
|
+
const emptyRecordingError = () => new Error('EMPTY_RECORDING');
|
|
17
|
+
const recordingHasNotStartedError = () => new Error('RECORDING_HAS_NOT_STARTED');
|
|
18
|
+
const failedToFetchRecordingError = () => new Error('FAILED_TO_FETCH_RECORDING');
|
|
19
|
+
const couldNotQueryPermissionStatusError = () => new Error('COULD_NOT_QUERY_PERMISSION_STATUS');
|
|
20
|
+
|
|
21
|
+
// these mime types will be checked one by one in order until one of them is found to be supported by the current browser
|
|
22
|
+
const possibleMimeTypes = ['audio/mp4', 'audio/webm;codecs=opus', 'audio/aac', 'audio/webm', 'audio/ogg;codecs=opus'];
|
|
23
|
+
const neverResolvingPromise = () => new Promise(() => undefined);
|
|
24
|
+
class VoiceRecorderImpl {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.mediaRecorder = null;
|
|
27
|
+
this.chunks = [];
|
|
28
|
+
this.pendingResult = neverResolvingPromise();
|
|
29
|
+
}
|
|
30
|
+
static async canDeviceVoiceRecord() {
|
|
31
|
+
var _a;
|
|
32
|
+
if (((_a = navigator === null || navigator === undefined ? undefined : navigator.mediaDevices) === null || _a === undefined ? undefined : _a.getUserMedia) == null || VoiceRecorderImpl.getSupportedMimeType() == null) {
|
|
33
|
+
return failureResponse();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return successResponse();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async startRecording() {
|
|
40
|
+
if (this.mediaRecorder != null) {
|
|
41
|
+
throw alreadyRecordingError();
|
|
42
|
+
}
|
|
43
|
+
const deviceCanRecord = await VoiceRecorderImpl.canDeviceVoiceRecord();
|
|
44
|
+
if (!deviceCanRecord.value) {
|
|
45
|
+
throw deviceCannotVoiceRecordError();
|
|
46
|
+
}
|
|
47
|
+
const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => successResponse());
|
|
48
|
+
if (!havingPermission.value) {
|
|
49
|
+
throw missingPermissionError();
|
|
50
|
+
}
|
|
51
|
+
return navigator.mediaDevices.getUserMedia({ audio: true })
|
|
52
|
+
.then(this.onSuccessfullyStartedRecording.bind(this))
|
|
53
|
+
.catch(this.onFailedToStartRecording.bind(this));
|
|
54
|
+
}
|
|
55
|
+
async stopRecording() {
|
|
56
|
+
if (this.mediaRecorder == null) {
|
|
57
|
+
throw recordingHasNotStartedError();
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
this.mediaRecorder.stop();
|
|
61
|
+
this.mediaRecorder.stream.getTracks().forEach(track => track.stop());
|
|
62
|
+
return this.pendingResult;
|
|
63
|
+
}
|
|
64
|
+
catch (ignore) {
|
|
65
|
+
throw failedToFetchRecordingError();
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
this.prepareInstanceForNextOperation();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
static async hasAudioRecordingPermission() {
|
|
72
|
+
return navigator.permissions.query({ name: 'microphone' })
|
|
73
|
+
.then(result => ({ value: result.state === 'granted' }))
|
|
74
|
+
.catch(() => {
|
|
75
|
+
throw couldNotQueryPermissionStatusError();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
static async requestAudioRecordingPermission() {
|
|
79
|
+
const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => failureResponse());
|
|
80
|
+
if (havingPermission.value) {
|
|
81
|
+
return successResponse();
|
|
82
|
+
}
|
|
83
|
+
return navigator.mediaDevices.getUserMedia({ audio: true })
|
|
84
|
+
.then(() => successResponse())
|
|
85
|
+
.catch(() => failureResponse());
|
|
86
|
+
}
|
|
87
|
+
pauseRecording() {
|
|
88
|
+
if (this.mediaRecorder == null) {
|
|
89
|
+
throw recordingHasNotStartedError();
|
|
90
|
+
}
|
|
91
|
+
else if (this.mediaRecorder.state === 'recording') {
|
|
92
|
+
this.mediaRecorder.pause();
|
|
93
|
+
return Promise.resolve(successResponse());
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return Promise.resolve(failureResponse());
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
resumeRecording() {
|
|
100
|
+
if (this.mediaRecorder == null) {
|
|
101
|
+
throw recordingHasNotStartedError();
|
|
102
|
+
}
|
|
103
|
+
else if (this.mediaRecorder.state === 'paused') {
|
|
104
|
+
this.mediaRecorder.resume();
|
|
105
|
+
return Promise.resolve(successResponse());
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
return Promise.resolve(failureResponse());
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
getCurrentStatus() {
|
|
112
|
+
if (this.mediaRecorder == null) {
|
|
113
|
+
return Promise.resolve({ status: 'NONE' });
|
|
114
|
+
}
|
|
115
|
+
else if (this.mediaRecorder.state === 'recording') {
|
|
116
|
+
return Promise.resolve({ status: 'RECORDING' });
|
|
117
|
+
}
|
|
118
|
+
else if (this.mediaRecorder.state === 'paused') {
|
|
119
|
+
return Promise.resolve({ status: 'PAUSED' });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
return Promise.resolve({ status: 'NONE' });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
static getSupportedMimeType() {
|
|
126
|
+
if ((MediaRecorder === null || MediaRecorder === undefined ? undefined : MediaRecorder.isTypeSupported) == null)
|
|
127
|
+
return null;
|
|
128
|
+
const foundSupportedType = possibleMimeTypes.find(type => MediaRecorder.isTypeSupported(type));
|
|
129
|
+
return foundSupportedType !== null && foundSupportedType !== undefined ? foundSupportedType : null;
|
|
130
|
+
}
|
|
131
|
+
onSuccessfullyStartedRecording(stream) {
|
|
132
|
+
this.pendingResult = new Promise((resolve, reject) => {
|
|
133
|
+
this.mediaRecorder = new MediaRecorder(stream);
|
|
134
|
+
this.mediaRecorder.onerror = () => {
|
|
135
|
+
this.prepareInstanceForNextOperation();
|
|
136
|
+
reject(failedToRecordError());
|
|
137
|
+
};
|
|
138
|
+
this.mediaRecorder.onstop = async () => {
|
|
139
|
+
const mimeType = VoiceRecorderImpl.getSupportedMimeType();
|
|
140
|
+
if (mimeType == null) {
|
|
141
|
+
this.prepareInstanceForNextOperation();
|
|
142
|
+
reject(failedToFetchRecordingError());
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const blobVoiceRecording = new Blob(this.chunks, { 'type': mimeType });
|
|
146
|
+
if (blobVoiceRecording.size <= 0) {
|
|
147
|
+
this.prepareInstanceForNextOperation();
|
|
148
|
+
reject(emptyRecordingError());
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const recordDataBase64 = await VoiceRecorderImpl.blobToBase64(blobVoiceRecording);
|
|
152
|
+
const recordingDuration = await getBlobDuration(blobVoiceRecording);
|
|
153
|
+
this.prepareInstanceForNextOperation();
|
|
154
|
+
resolve({ value: { recordDataBase64, mimeType, msDuration: recordingDuration * 1000 } });
|
|
155
|
+
};
|
|
156
|
+
this.mediaRecorder.ondataavailable = (event) => this.chunks.push(event.data);
|
|
157
|
+
this.mediaRecorder.start();
|
|
158
|
+
});
|
|
159
|
+
return successResponse();
|
|
160
|
+
}
|
|
161
|
+
onFailedToStartRecording() {
|
|
162
|
+
this.prepareInstanceForNextOperation();
|
|
163
|
+
throw failedToRecordError();
|
|
164
|
+
}
|
|
165
|
+
static blobToBase64(blob) {
|
|
166
|
+
return new Promise(resolve => {
|
|
167
|
+
const reader = new FileReader();
|
|
168
|
+
reader.onloadend = () => {
|
|
169
|
+
const recordingResult = String(reader.result);
|
|
170
|
+
const splitResult = recordingResult.split('base64,');
|
|
171
|
+
const toResolve = (splitResult.length > 1) ? splitResult[1] : recordingResult;
|
|
172
|
+
resolve(toResolve.trim());
|
|
173
|
+
};
|
|
174
|
+
reader.readAsDataURL(blob);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
prepareInstanceForNextOperation() {
|
|
178
|
+
if (this.mediaRecorder != null && this.mediaRecorder.state === 'recording') {
|
|
179
|
+
try {
|
|
180
|
+
this.mediaRecorder.stop();
|
|
181
|
+
}
|
|
182
|
+
catch (ignore) {
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
this.pendingResult = neverResolvingPromise();
|
|
186
|
+
this.mediaRecorder = null;
|
|
187
|
+
this.chunks = [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
class VoiceRecorderWeb extends core.WebPlugin {
|
|
192
|
+
constructor() {
|
|
193
|
+
super(...arguments);
|
|
194
|
+
this.voiceRecorderInstance = new VoiceRecorderImpl();
|
|
195
|
+
}
|
|
196
|
+
canDeviceVoiceRecord() {
|
|
197
|
+
return VoiceRecorderImpl.canDeviceVoiceRecord();
|
|
198
|
+
}
|
|
199
|
+
hasAudioRecordingPermission() {
|
|
200
|
+
return VoiceRecorderImpl.hasAudioRecordingPermission();
|
|
201
|
+
}
|
|
202
|
+
requestAudioRecordingPermission() {
|
|
203
|
+
return VoiceRecorderImpl.requestAudioRecordingPermission();
|
|
204
|
+
}
|
|
205
|
+
startRecording() {
|
|
206
|
+
return this.voiceRecorderInstance.startRecording();
|
|
207
|
+
}
|
|
208
|
+
stopRecording() {
|
|
209
|
+
return this.voiceRecorderInstance.stopRecording();
|
|
210
|
+
}
|
|
211
|
+
pauseRecording() {
|
|
212
|
+
return this.voiceRecorderInstance.pauseRecording();
|
|
213
|
+
}
|
|
214
|
+
resumeRecording() {
|
|
215
|
+
return this.voiceRecorderInstance.resumeRecording();
|
|
216
|
+
}
|
|
217
|
+
getCurrentStatus() {
|
|
218
|
+
return this.voiceRecorderInstance.getCurrentStatus();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
var web = /*#__PURE__*/Object.freeze({
|
|
223
|
+
__proto__: null,
|
|
224
|
+
VoiceRecorderWeb: VoiceRecorderWeb
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
exports.VoiceRecorder = VoiceRecorder;
|
|
228
|
+
//# sourceMappingURL=plugin.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/predefined-web-responses.js","esm/VoiceRecorderImpl.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst VoiceRecorder = registerPlugin('VoiceRecorder', {\n web: () => import('./web').then(m => new m.VoiceRecorderWeb()),\n});\nexport * from './definitions';\nexport { VoiceRecorder };\n//# sourceMappingURL=index.js.map","export const successResponse = () => ({ value: true });\nexport const failureResponse = () => ({ value: false });\nexport const missingPermissionError = () => new Error('MISSING_PERMISSION');\nexport const alreadyRecordingError = () => new Error('ALREADY_RECORDING');\nexport const microphoneBeingUsedError = () => new Error('MICROPHONE_BEING_USED');\nexport const deviceCannotVoiceRecordError = () => new Error('DEVICE_CANNOT_VOICE_RECORD');\nexport const failedToRecordError = () => new Error('FAILED_TO_RECORD');\nexport const emptyRecordingError = () => new Error('EMPTY_RECORDING');\nexport const recordingHasNotStartedError = () => new Error('RECORDING_HAS_NOT_STARTED');\nexport const failedToFetchRecordingError = () => new Error('FAILED_TO_FETCH_RECORDING');\nexport const couldNotQueryPermissionStatusError = () => new Error('COULD_NOT_QUERY_PERMISSION_STATUS');\n//# sourceMappingURL=predefined-web-responses.js.map","import getBlobDuration from 'get-blob-duration';\nimport { alreadyRecordingError, couldNotQueryPermissionStatusError, deviceCannotVoiceRecordError, emptyRecordingError, failedToFetchRecordingError, failedToRecordError, failureResponse, missingPermissionError, recordingHasNotStartedError, successResponse, } from './predefined-web-responses';\n// these mime types will be checked one by one in order until one of them is found to be supported by the current browser\nconst possibleMimeTypes = ['audio/mp4', 'audio/webm;codecs=opus', 'audio/aac', 'audio/webm', 'audio/ogg;codecs=opus'];\nconst neverResolvingPromise = () => new Promise(() => undefined);\nexport class VoiceRecorderImpl {\n constructor() {\n this.mediaRecorder = null;\n this.chunks = [];\n this.pendingResult = neverResolvingPromise();\n }\n static async canDeviceVoiceRecord() {\n var _a;\n if (((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) == null || VoiceRecorderImpl.getSupportedMimeType() == null) {\n return failureResponse();\n }\n else {\n return successResponse();\n }\n }\n async startRecording() {\n if (this.mediaRecorder != null) {\n throw alreadyRecordingError();\n }\n const deviceCanRecord = await VoiceRecorderImpl.canDeviceVoiceRecord();\n if (!deviceCanRecord.value) {\n throw deviceCannotVoiceRecordError();\n }\n const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => successResponse());\n if (!havingPermission.value) {\n throw missingPermissionError();\n }\n return navigator.mediaDevices.getUserMedia({ audio: true })\n .then(this.onSuccessfullyStartedRecording.bind(this))\n .catch(this.onFailedToStartRecording.bind(this));\n }\n async stopRecording() {\n if (this.mediaRecorder == null) {\n throw recordingHasNotStartedError();\n }\n try {\n this.mediaRecorder.stop();\n this.mediaRecorder.stream.getTracks().forEach(track => track.stop());\n return this.pendingResult;\n }\n catch (ignore) {\n throw failedToFetchRecordingError();\n }\n finally {\n this.prepareInstanceForNextOperation();\n }\n }\n static async hasAudioRecordingPermission() {\n return navigator.permissions.query({ name: 'microphone' })\n .then(result => ({ value: result.state === 'granted' }))\n .catch(() => {\n throw couldNotQueryPermissionStatusError();\n });\n }\n static async requestAudioRecordingPermission() {\n const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => failureResponse());\n if (havingPermission.value) {\n return successResponse();\n }\n return navigator.mediaDevices.getUserMedia({ audio: true })\n .then(() => successResponse())\n .catch(() => failureResponse());\n }\n pauseRecording() {\n if (this.mediaRecorder == null) {\n throw recordingHasNotStartedError();\n }\n else if (this.mediaRecorder.state === 'recording') {\n this.mediaRecorder.pause();\n return Promise.resolve(successResponse());\n }\n else {\n return Promise.resolve(failureResponse());\n }\n }\n resumeRecording() {\n if (this.mediaRecorder == null) {\n throw recordingHasNotStartedError();\n }\n else if (this.mediaRecorder.state === 'paused') {\n this.mediaRecorder.resume();\n return Promise.resolve(successResponse());\n }\n else {\n return Promise.resolve(failureResponse());\n }\n }\n getCurrentStatus() {\n if (this.mediaRecorder == null) {\n return Promise.resolve({ status: 'NONE' });\n }\n else if (this.mediaRecorder.state === 'recording') {\n return Promise.resolve({ status: 'RECORDING' });\n }\n else if (this.mediaRecorder.state === 'paused') {\n return Promise.resolve({ status: 'PAUSED' });\n }\n else {\n return Promise.resolve({ status: 'NONE' });\n }\n }\n static getSupportedMimeType() {\n if ((MediaRecorder === null || MediaRecorder === void 0 ? void 0 : MediaRecorder.isTypeSupported) == null)\n return null;\n const foundSupportedType = possibleMimeTypes.find(type => MediaRecorder.isTypeSupported(type));\n return foundSupportedType !== null && foundSupportedType !== void 0 ? foundSupportedType : null;\n }\n onSuccessfullyStartedRecording(stream) {\n this.pendingResult = new Promise((resolve, reject) => {\n this.mediaRecorder = new MediaRecorder(stream);\n this.mediaRecorder.onerror = () => {\n this.prepareInstanceForNextOperation();\n reject(failedToRecordError());\n };\n this.mediaRecorder.onstop = async () => {\n const mimeType = VoiceRecorderImpl.getSupportedMimeType();\n if (mimeType == null) {\n this.prepareInstanceForNextOperation();\n reject(failedToFetchRecordingError());\n return;\n }\n const blobVoiceRecording = new Blob(this.chunks, { 'type': mimeType });\n if (blobVoiceRecording.size <= 0) {\n this.prepareInstanceForNextOperation();\n reject(emptyRecordingError());\n return;\n }\n const recordDataBase64 = await VoiceRecorderImpl.blobToBase64(blobVoiceRecording);\n const recordingDuration = await getBlobDuration(blobVoiceRecording);\n this.prepareInstanceForNextOperation();\n resolve({ value: { recordDataBase64, mimeType, msDuration: recordingDuration * 1000 } });\n };\n this.mediaRecorder.ondataavailable = (event) => this.chunks.push(event.data);\n this.mediaRecorder.start();\n });\n return successResponse();\n }\n onFailedToStartRecording() {\n this.prepareInstanceForNextOperation();\n throw failedToRecordError();\n }\n static blobToBase64(blob) {\n return new Promise(resolve => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const recordingResult = String(reader.result);\n const splitResult = recordingResult.split('base64,');\n const toResolve = (splitResult.length > 1) ? splitResult[1] : recordingResult;\n resolve(toResolve.trim());\n };\n reader.readAsDataURL(blob);\n });\n }\n prepareInstanceForNextOperation() {\n if (this.mediaRecorder != null && this.mediaRecorder.state === 'recording') {\n try {\n this.mediaRecorder.stop();\n }\n catch (ignore) {\n }\n }\n this.pendingResult = neverResolvingPromise();\n this.mediaRecorder = null;\n this.chunks = [];\n }\n}\n//# sourceMappingURL=VoiceRecorderImpl.js.map","import { WebPlugin } from '@capacitor/core';\nimport { VoiceRecorderImpl } from './VoiceRecorderImpl';\nexport class VoiceRecorderWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.voiceRecorderInstance = new VoiceRecorderImpl();\n }\n canDeviceVoiceRecord() {\n return VoiceRecorderImpl.canDeviceVoiceRecord();\n }\n hasAudioRecordingPermission() {\n return VoiceRecorderImpl.hasAudioRecordingPermission();\n }\n requestAudioRecordingPermission() {\n return VoiceRecorderImpl.requestAudioRecordingPermission();\n }\n startRecording() {\n return this.voiceRecorderInstance.startRecording();\n }\n stopRecording() {\n return this.voiceRecorderInstance.stopRecording();\n }\n pauseRecording() {\n return this.voiceRecorderInstance.pauseRecording();\n }\n resumeRecording() {\n return this.voiceRecorderInstance.resumeRecording();\n }\n getCurrentStatus() {\n return this.voiceRecorderInstance.getCurrentStatus();\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
var capacitorVoiceRecorderWavStereo = (function (exports, core, getBlobDuration) {
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const VoiceRecorder = core.registerPlugin('VoiceRecorder', {
|
|
5
|
+
web: () => Promise.resolve().then(function () { return web; }).then(m => new m.VoiceRecorderWeb()),
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
const successResponse = () => ({ value: true });
|
|
9
|
+
const failureResponse = () => ({ value: false });
|
|
10
|
+
const missingPermissionError = () => new Error('MISSING_PERMISSION');
|
|
11
|
+
const alreadyRecordingError = () => new Error('ALREADY_RECORDING');
|
|
12
|
+
const deviceCannotVoiceRecordError = () => new Error('DEVICE_CANNOT_VOICE_RECORD');
|
|
13
|
+
const failedToRecordError = () => new Error('FAILED_TO_RECORD');
|
|
14
|
+
const emptyRecordingError = () => new Error('EMPTY_RECORDING');
|
|
15
|
+
const recordingHasNotStartedError = () => new Error('RECORDING_HAS_NOT_STARTED');
|
|
16
|
+
const failedToFetchRecordingError = () => new Error('FAILED_TO_FETCH_RECORDING');
|
|
17
|
+
const couldNotQueryPermissionStatusError = () => new Error('COULD_NOT_QUERY_PERMISSION_STATUS');
|
|
18
|
+
|
|
19
|
+
// these mime types will be checked one by one in order until one of them is found to be supported by the current browser
|
|
20
|
+
const possibleMimeTypes = ['audio/mp4', 'audio/webm;codecs=opus', 'audio/aac', 'audio/webm', 'audio/ogg;codecs=opus'];
|
|
21
|
+
const neverResolvingPromise = () => new Promise(() => undefined);
|
|
22
|
+
class VoiceRecorderImpl {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.mediaRecorder = null;
|
|
25
|
+
this.chunks = [];
|
|
26
|
+
this.pendingResult = neverResolvingPromise();
|
|
27
|
+
}
|
|
28
|
+
static async canDeviceVoiceRecord() {
|
|
29
|
+
var _a;
|
|
30
|
+
if (((_a = navigator === null || navigator === undefined ? undefined : navigator.mediaDevices) === null || _a === undefined ? undefined : _a.getUserMedia) == null || VoiceRecorderImpl.getSupportedMimeType() == null) {
|
|
31
|
+
return failureResponse();
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return successResponse();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async startRecording() {
|
|
38
|
+
if (this.mediaRecorder != null) {
|
|
39
|
+
throw alreadyRecordingError();
|
|
40
|
+
}
|
|
41
|
+
const deviceCanRecord = await VoiceRecorderImpl.canDeviceVoiceRecord();
|
|
42
|
+
if (!deviceCanRecord.value) {
|
|
43
|
+
throw deviceCannotVoiceRecordError();
|
|
44
|
+
}
|
|
45
|
+
const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => successResponse());
|
|
46
|
+
if (!havingPermission.value) {
|
|
47
|
+
throw missingPermissionError();
|
|
48
|
+
}
|
|
49
|
+
return navigator.mediaDevices.getUserMedia({ audio: true })
|
|
50
|
+
.then(this.onSuccessfullyStartedRecording.bind(this))
|
|
51
|
+
.catch(this.onFailedToStartRecording.bind(this));
|
|
52
|
+
}
|
|
53
|
+
async stopRecording() {
|
|
54
|
+
if (this.mediaRecorder == null) {
|
|
55
|
+
throw recordingHasNotStartedError();
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
this.mediaRecorder.stop();
|
|
59
|
+
this.mediaRecorder.stream.getTracks().forEach(track => track.stop());
|
|
60
|
+
return this.pendingResult;
|
|
61
|
+
}
|
|
62
|
+
catch (ignore) {
|
|
63
|
+
throw failedToFetchRecordingError();
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
this.prepareInstanceForNextOperation();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
static async hasAudioRecordingPermission() {
|
|
70
|
+
return navigator.permissions.query({ name: 'microphone' })
|
|
71
|
+
.then(result => ({ value: result.state === 'granted' }))
|
|
72
|
+
.catch(() => {
|
|
73
|
+
throw couldNotQueryPermissionStatusError();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
static async requestAudioRecordingPermission() {
|
|
77
|
+
const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => failureResponse());
|
|
78
|
+
if (havingPermission.value) {
|
|
79
|
+
return successResponse();
|
|
80
|
+
}
|
|
81
|
+
return navigator.mediaDevices.getUserMedia({ audio: true })
|
|
82
|
+
.then(() => successResponse())
|
|
83
|
+
.catch(() => failureResponse());
|
|
84
|
+
}
|
|
85
|
+
pauseRecording() {
|
|
86
|
+
if (this.mediaRecorder == null) {
|
|
87
|
+
throw recordingHasNotStartedError();
|
|
88
|
+
}
|
|
89
|
+
else if (this.mediaRecorder.state === 'recording') {
|
|
90
|
+
this.mediaRecorder.pause();
|
|
91
|
+
return Promise.resolve(successResponse());
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return Promise.resolve(failureResponse());
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
resumeRecording() {
|
|
98
|
+
if (this.mediaRecorder == null) {
|
|
99
|
+
throw recordingHasNotStartedError();
|
|
100
|
+
}
|
|
101
|
+
else if (this.mediaRecorder.state === 'paused') {
|
|
102
|
+
this.mediaRecorder.resume();
|
|
103
|
+
return Promise.resolve(successResponse());
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return Promise.resolve(failureResponse());
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
getCurrentStatus() {
|
|
110
|
+
if (this.mediaRecorder == null) {
|
|
111
|
+
return Promise.resolve({ status: 'NONE' });
|
|
112
|
+
}
|
|
113
|
+
else if (this.mediaRecorder.state === 'recording') {
|
|
114
|
+
return Promise.resolve({ status: 'RECORDING' });
|
|
115
|
+
}
|
|
116
|
+
else if (this.mediaRecorder.state === 'paused') {
|
|
117
|
+
return Promise.resolve({ status: 'PAUSED' });
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return Promise.resolve({ status: 'NONE' });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
static getSupportedMimeType() {
|
|
124
|
+
if ((MediaRecorder === null || MediaRecorder === undefined ? undefined : MediaRecorder.isTypeSupported) == null)
|
|
125
|
+
return null;
|
|
126
|
+
const foundSupportedType = possibleMimeTypes.find(type => MediaRecorder.isTypeSupported(type));
|
|
127
|
+
return foundSupportedType !== null && foundSupportedType !== undefined ? foundSupportedType : null;
|
|
128
|
+
}
|
|
129
|
+
onSuccessfullyStartedRecording(stream) {
|
|
130
|
+
this.pendingResult = new Promise((resolve, reject) => {
|
|
131
|
+
this.mediaRecorder = new MediaRecorder(stream);
|
|
132
|
+
this.mediaRecorder.onerror = () => {
|
|
133
|
+
this.prepareInstanceForNextOperation();
|
|
134
|
+
reject(failedToRecordError());
|
|
135
|
+
};
|
|
136
|
+
this.mediaRecorder.onstop = async () => {
|
|
137
|
+
const mimeType = VoiceRecorderImpl.getSupportedMimeType();
|
|
138
|
+
if (mimeType == null) {
|
|
139
|
+
this.prepareInstanceForNextOperation();
|
|
140
|
+
reject(failedToFetchRecordingError());
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const blobVoiceRecording = new Blob(this.chunks, { 'type': mimeType });
|
|
144
|
+
if (blobVoiceRecording.size <= 0) {
|
|
145
|
+
this.prepareInstanceForNextOperation();
|
|
146
|
+
reject(emptyRecordingError());
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const recordDataBase64 = await VoiceRecorderImpl.blobToBase64(blobVoiceRecording);
|
|
150
|
+
const recordingDuration = await getBlobDuration(blobVoiceRecording);
|
|
151
|
+
this.prepareInstanceForNextOperation();
|
|
152
|
+
resolve({ value: { recordDataBase64, mimeType, msDuration: recordingDuration * 1000 } });
|
|
153
|
+
};
|
|
154
|
+
this.mediaRecorder.ondataavailable = (event) => this.chunks.push(event.data);
|
|
155
|
+
this.mediaRecorder.start();
|
|
156
|
+
});
|
|
157
|
+
return successResponse();
|
|
158
|
+
}
|
|
159
|
+
onFailedToStartRecording() {
|
|
160
|
+
this.prepareInstanceForNextOperation();
|
|
161
|
+
throw failedToRecordError();
|
|
162
|
+
}
|
|
163
|
+
static blobToBase64(blob) {
|
|
164
|
+
return new Promise(resolve => {
|
|
165
|
+
const reader = new FileReader();
|
|
166
|
+
reader.onloadend = () => {
|
|
167
|
+
const recordingResult = String(reader.result);
|
|
168
|
+
const splitResult = recordingResult.split('base64,');
|
|
169
|
+
const toResolve = (splitResult.length > 1) ? splitResult[1] : recordingResult;
|
|
170
|
+
resolve(toResolve.trim());
|
|
171
|
+
};
|
|
172
|
+
reader.readAsDataURL(blob);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
prepareInstanceForNextOperation() {
|
|
176
|
+
if (this.mediaRecorder != null && this.mediaRecorder.state === 'recording') {
|
|
177
|
+
try {
|
|
178
|
+
this.mediaRecorder.stop();
|
|
179
|
+
}
|
|
180
|
+
catch (ignore) {
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
this.pendingResult = neverResolvingPromise();
|
|
184
|
+
this.mediaRecorder = null;
|
|
185
|
+
this.chunks = [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
class VoiceRecorderWeb extends core.WebPlugin {
|
|
190
|
+
constructor() {
|
|
191
|
+
super(...arguments);
|
|
192
|
+
this.voiceRecorderInstance = new VoiceRecorderImpl();
|
|
193
|
+
}
|
|
194
|
+
canDeviceVoiceRecord() {
|
|
195
|
+
return VoiceRecorderImpl.canDeviceVoiceRecord();
|
|
196
|
+
}
|
|
197
|
+
hasAudioRecordingPermission() {
|
|
198
|
+
return VoiceRecorderImpl.hasAudioRecordingPermission();
|
|
199
|
+
}
|
|
200
|
+
requestAudioRecordingPermission() {
|
|
201
|
+
return VoiceRecorderImpl.requestAudioRecordingPermission();
|
|
202
|
+
}
|
|
203
|
+
startRecording() {
|
|
204
|
+
return this.voiceRecorderInstance.startRecording();
|
|
205
|
+
}
|
|
206
|
+
stopRecording() {
|
|
207
|
+
return this.voiceRecorderInstance.stopRecording();
|
|
208
|
+
}
|
|
209
|
+
pauseRecording() {
|
|
210
|
+
return this.voiceRecorderInstance.pauseRecording();
|
|
211
|
+
}
|
|
212
|
+
resumeRecording() {
|
|
213
|
+
return this.voiceRecorderInstance.resumeRecording();
|
|
214
|
+
}
|
|
215
|
+
getCurrentStatus() {
|
|
216
|
+
return this.voiceRecorderInstance.getCurrentStatus();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
var web = /*#__PURE__*/Object.freeze({
|
|
221
|
+
__proto__: null,
|
|
222
|
+
VoiceRecorderWeb: VoiceRecorderWeb
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
exports.VoiceRecorder = VoiceRecorder;
|
|
226
|
+
|
|
227
|
+
return exports;
|
|
228
|
+
|
|
229
|
+
})({}, capacitorExports, getBlobDuration);
|
|
230
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/predefined-web-responses.js","esm/VoiceRecorderImpl.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst VoiceRecorder = registerPlugin('VoiceRecorder', {\n web: () => import('./web').then(m => new m.VoiceRecorderWeb()),\n});\nexport * from './definitions';\nexport { VoiceRecorder };\n//# sourceMappingURL=index.js.map","export const successResponse = () => ({ value: true });\nexport const failureResponse = () => ({ value: false });\nexport const missingPermissionError = () => new Error('MISSING_PERMISSION');\nexport const alreadyRecordingError = () => new Error('ALREADY_RECORDING');\nexport const microphoneBeingUsedError = () => new Error('MICROPHONE_BEING_USED');\nexport const deviceCannotVoiceRecordError = () => new Error('DEVICE_CANNOT_VOICE_RECORD');\nexport const failedToRecordError = () => new Error('FAILED_TO_RECORD');\nexport const emptyRecordingError = () => new Error('EMPTY_RECORDING');\nexport const recordingHasNotStartedError = () => new Error('RECORDING_HAS_NOT_STARTED');\nexport const failedToFetchRecordingError = () => new Error('FAILED_TO_FETCH_RECORDING');\nexport const couldNotQueryPermissionStatusError = () => new Error('COULD_NOT_QUERY_PERMISSION_STATUS');\n//# sourceMappingURL=predefined-web-responses.js.map","import getBlobDuration from 'get-blob-duration';\nimport { alreadyRecordingError, couldNotQueryPermissionStatusError, deviceCannotVoiceRecordError, emptyRecordingError, failedToFetchRecordingError, failedToRecordError, failureResponse, missingPermissionError, recordingHasNotStartedError, successResponse, } from './predefined-web-responses';\n// these mime types will be checked one by one in order until one of them is found to be supported by the current browser\nconst possibleMimeTypes = ['audio/mp4', 'audio/webm;codecs=opus', 'audio/aac', 'audio/webm', 'audio/ogg;codecs=opus'];\nconst neverResolvingPromise = () => new Promise(() => undefined);\nexport class VoiceRecorderImpl {\n constructor() {\n this.mediaRecorder = null;\n this.chunks = [];\n this.pendingResult = neverResolvingPromise();\n }\n static async canDeviceVoiceRecord() {\n var _a;\n if (((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) == null || VoiceRecorderImpl.getSupportedMimeType() == null) {\n return failureResponse();\n }\n else {\n return successResponse();\n }\n }\n async startRecording() {\n if (this.mediaRecorder != null) {\n throw alreadyRecordingError();\n }\n const deviceCanRecord = await VoiceRecorderImpl.canDeviceVoiceRecord();\n if (!deviceCanRecord.value) {\n throw deviceCannotVoiceRecordError();\n }\n const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => successResponse());\n if (!havingPermission.value) {\n throw missingPermissionError();\n }\n return navigator.mediaDevices.getUserMedia({ audio: true })\n .then(this.onSuccessfullyStartedRecording.bind(this))\n .catch(this.onFailedToStartRecording.bind(this));\n }\n async stopRecording() {\n if (this.mediaRecorder == null) {\n throw recordingHasNotStartedError();\n }\n try {\n this.mediaRecorder.stop();\n this.mediaRecorder.stream.getTracks().forEach(track => track.stop());\n return this.pendingResult;\n }\n catch (ignore) {\n throw failedToFetchRecordingError();\n }\n finally {\n this.prepareInstanceForNextOperation();\n }\n }\n static async hasAudioRecordingPermission() {\n return navigator.permissions.query({ name: 'microphone' })\n .then(result => ({ value: result.state === 'granted' }))\n .catch(() => {\n throw couldNotQueryPermissionStatusError();\n });\n }\n static async requestAudioRecordingPermission() {\n const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => failureResponse());\n if (havingPermission.value) {\n return successResponse();\n }\n return navigator.mediaDevices.getUserMedia({ audio: true })\n .then(() => successResponse())\n .catch(() => failureResponse());\n }\n pauseRecording() {\n if (this.mediaRecorder == null) {\n throw recordingHasNotStartedError();\n }\n else if (this.mediaRecorder.state === 'recording') {\n this.mediaRecorder.pause();\n return Promise.resolve(successResponse());\n }\n else {\n return Promise.resolve(failureResponse());\n }\n }\n resumeRecording() {\n if (this.mediaRecorder == null) {\n throw recordingHasNotStartedError();\n }\n else if (this.mediaRecorder.state === 'paused') {\n this.mediaRecorder.resume();\n return Promise.resolve(successResponse());\n }\n else {\n return Promise.resolve(failureResponse());\n }\n }\n getCurrentStatus() {\n if (this.mediaRecorder == null) {\n return Promise.resolve({ status: 'NONE' });\n }\n else if (this.mediaRecorder.state === 'recording') {\n return Promise.resolve({ status: 'RECORDING' });\n }\n else if (this.mediaRecorder.state === 'paused') {\n return Promise.resolve({ status: 'PAUSED' });\n }\n else {\n return Promise.resolve({ status: 'NONE' });\n }\n }\n static getSupportedMimeType() {\n if ((MediaRecorder === null || MediaRecorder === void 0 ? void 0 : MediaRecorder.isTypeSupported) == null)\n return null;\n const foundSupportedType = possibleMimeTypes.find(type => MediaRecorder.isTypeSupported(type));\n return foundSupportedType !== null && foundSupportedType !== void 0 ? foundSupportedType : null;\n }\n onSuccessfullyStartedRecording(stream) {\n this.pendingResult = new Promise((resolve, reject) => {\n this.mediaRecorder = new MediaRecorder(stream);\n this.mediaRecorder.onerror = () => {\n this.prepareInstanceForNextOperation();\n reject(failedToRecordError());\n };\n this.mediaRecorder.onstop = async () => {\n const mimeType = VoiceRecorderImpl.getSupportedMimeType();\n if (mimeType == null) {\n this.prepareInstanceForNextOperation();\n reject(failedToFetchRecordingError());\n return;\n }\n const blobVoiceRecording = new Blob(this.chunks, { 'type': mimeType });\n if (blobVoiceRecording.size <= 0) {\n this.prepareInstanceForNextOperation();\n reject(emptyRecordingError());\n return;\n }\n const recordDataBase64 = await VoiceRecorderImpl.blobToBase64(blobVoiceRecording);\n const recordingDuration = await getBlobDuration(blobVoiceRecording);\n this.prepareInstanceForNextOperation();\n resolve({ value: { recordDataBase64, mimeType, msDuration: recordingDuration * 1000 } });\n };\n this.mediaRecorder.ondataavailable = (event) => this.chunks.push(event.data);\n this.mediaRecorder.start();\n });\n return successResponse();\n }\n onFailedToStartRecording() {\n this.prepareInstanceForNextOperation();\n throw failedToRecordError();\n }\n static blobToBase64(blob) {\n return new Promise(resolve => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const recordingResult = String(reader.result);\n const splitResult = recordingResult.split('base64,');\n const toResolve = (splitResult.length > 1) ? splitResult[1] : recordingResult;\n resolve(toResolve.trim());\n };\n reader.readAsDataURL(blob);\n });\n }\n prepareInstanceForNextOperation() {\n if (this.mediaRecorder != null && this.mediaRecorder.state === 'recording') {\n try {\n this.mediaRecorder.stop();\n }\n catch (ignore) {\n }\n }\n this.pendingResult = neverResolvingPromise();\n this.mediaRecorder = null;\n this.chunks = [];\n }\n}\n//# sourceMappingURL=VoiceRecorderImpl.js.map","import { WebPlugin } from '@capacitor/core';\nimport { VoiceRecorderImpl } from './VoiceRecorderImpl';\nexport class VoiceRecorderWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.voiceRecorderInstance = new VoiceRecorderImpl();\n }\n canDeviceVoiceRecord() {\n return VoiceRecorderImpl.canDeviceVoiceRecord();\n }\n hasAudioRecordingPermission() {\n return VoiceRecorderImpl.hasAudioRecordingPermission();\n }\n requestAudioRecordingPermission() {\n return VoiceRecorderImpl.requestAudioRecordingPermission();\n }\n startRecording() {\n return this.voiceRecorderInstance.startRecording();\n }\n stopRecording() {\n return this.voiceRecorderInstance.stopRecording();\n }\n pauseRecording() {\n return this.voiceRecorderInstance.pauseRecording();\n }\n resumeRecording() {\n return this.voiceRecorderInstance.resumeRecording();\n }\n getCurrentStatus() {\n return this.voiceRecorderInstance.getCurrentStatus();\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;AACK,UAAC,aAAa,GAAGA,mBAAc,CAAC,eAAe,EAAE;IACtD,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAClE,CAAC;;ICHM,MAAM,eAAe,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/C,MAAM,eAAe,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAChD,MAAM,sBAAsB,GAAG,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;IACpE,MAAM,qBAAqB,GAAG,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;IAElE,MAAM,4BAA4B,GAAG,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAClF,MAAM,mBAAmB,GAAG,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC;IAC/D,MAAM,mBAAmB,GAAG,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;IAC9D,MAAM,2BAA2B,GAAG,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC;IAChF,MAAM,2BAA2B,GAAG,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC;IAChF,MAAM,kCAAkC,GAAG,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;;ICRtG;IACA,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,wBAAwB,EAAE,WAAW,EAAE,YAAY,EAAE,uBAAuB,CAAC;IACrH,MAAM,qBAAqB,GAAG,MAAM,IAAI,OAAO,CAAC,MAAM,SAAS,CAAC;IACzD,MAAM,iBAAiB,CAAC;IAC/B,IAAI,WAAW,GAAG;IAClB,QAAQ,IAAI,CAAC,aAAa,GAAG,IAAI;IACjC,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE;IACxB,QAAQ,IAAI,CAAC,aAAa,GAAG,qBAAqB,EAAE;IACpD;IACA,IAAI,aAAa,oBAAoB,GAAG;IACxC,QAAQ,IAAI,EAAE;IACd,QAAQ,IAAI,CAAC,CAAC,EAAE,GAAG,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAM,GAAG,SAAM,GAAG,SAAS,CAAC,YAAY,MAAM,IAAI,IAAI,EAAE,KAAK,SAAM,GAAG,SAAM,GAAG,EAAE,CAAC,YAAY,KAAK,IAAI,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,IAAI,IAAI,EAAE;IACpN,YAAY,OAAO,eAAe,EAAE;IACpC;IACA,aAAa;IACb,YAAY,OAAO,eAAe,EAAE;IACpC;IACA;IACA,IAAI,MAAM,cAAc,GAAG;IAC3B,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;IACxC,YAAY,MAAM,qBAAqB,EAAE;IACzC;IACA,QAAQ,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,oBAAoB,EAAE;IAC9E,QAAQ,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;IACpC,YAAY,MAAM,4BAA4B,EAAE;IAChD;IACA,QAAQ,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,2BAA2B,EAAE,CAAC,KAAK,CAAC,MAAM,eAAe,EAAE,CAAC;IACrH,QAAQ,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;IACrC,YAAY,MAAM,sBAAsB,EAAE;IAC1C;IACA,QAAQ,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;IAClE,aAAa,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,aAAa,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D;IACA,IAAI,MAAM,aAAa,GAAG;IAC1B,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;IACxC,YAAY,MAAM,2BAA2B,EAAE;IAC/C;IACA,QAAQ,IAAI;IACZ,YAAY,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IACrC,YAAY,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAChF,YAAY,OAAO,IAAI,CAAC,aAAa;IACrC;IACA,QAAQ,OAAO,MAAM,EAAE;IACvB,YAAY,MAAM,2BAA2B,EAAE;IAC/C;IACA,gBAAgB;IAChB,YAAY,IAAI,CAAC,+BAA+B,EAAE;IAClD;IACA;IACA,IAAI,aAAa,2BAA2B,GAAG;IAC/C,QAAQ,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE;IACjE,aAAa,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;IACnE,aAAa,KAAK,CAAC,MAAM;IACzB,YAAY,MAAM,kCAAkC,EAAE;IACtD,SAAS,CAAC;IACV;IACA,IAAI,aAAa,+BAA+B,GAAG;IACnD,QAAQ,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,2BAA2B,EAAE,CAAC,KAAK,CAAC,MAAM,eAAe,EAAE,CAAC;IACrH,QAAQ,IAAI,gBAAgB,CAAC,KAAK,EAAE;IACpC,YAAY,OAAO,eAAe,EAAE;IACpC;IACA,QAAQ,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;IAClE,aAAa,IAAI,CAAC,MAAM,eAAe,EAAE;IACzC,aAAa,KAAK,CAAC,MAAM,eAAe,EAAE,CAAC;IAC3C;IACA,IAAI,cAAc,GAAG;IACrB,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;IACxC,YAAY,MAAM,2BAA2B,EAAE;IAC/C;IACA,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,WAAW,EAAE;IAC3D,YAAY,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;IACtC,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACrD;IACA,aAAa;IACb,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACrD;IACA;IACA,IAAI,eAAe,GAAG;IACtB,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;IACxC,YAAY,MAAM,2BAA2B,EAAE;IAC/C;IACA,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,QAAQ,EAAE;IACxD,YAAY,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;IACvC,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACrD;IACA,aAAa;IACb,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACrD;IACA;IACA,IAAI,gBAAgB,GAAG;IACvB,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;IACxC,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtD;IACA,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,WAAW,EAAE;IAC3D,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC3D;IACA,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,QAAQ,EAAE;IACxD,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACxD;IACA,aAAa;IACb,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtD;IACA;IACA,IAAI,OAAO,oBAAoB,GAAG;IAClC,QAAQ,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAM,GAAG,SAAM,GAAG,aAAa,CAAC,eAAe,KAAK,IAAI;IACjH,YAAY,OAAO,IAAI;IACvB,QAAQ,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtG,QAAQ,OAAO,kBAAkB,KAAK,IAAI,IAAI,kBAAkB,KAAK,SAAM,GAAG,kBAAkB,GAAG,IAAI;IACvG;IACA,IAAI,8BAA8B,CAAC,MAAM,EAAE;IAC3C,QAAQ,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IAC9D,YAAY,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC;IAC1D,YAAY,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,MAAM;IAC/C,gBAAgB,IAAI,CAAC,+BAA+B,EAAE;IACtD,gBAAgB,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAC7C,aAAa;IACb,YAAY,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,YAAY;IACpD,gBAAgB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,oBAAoB,EAAE;IACzE,gBAAgB,IAAI,QAAQ,IAAI,IAAI,EAAE;IACtC,oBAAoB,IAAI,CAAC,+BAA+B,EAAE;IAC1D,oBAAoB,MAAM,CAAC,2BAA2B,EAAE,CAAC;IACzD,oBAAoB;IACpB;IACA,gBAAgB,MAAM,kBAAkB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACtF,gBAAgB,IAAI,kBAAkB,CAAC,IAAI,IAAI,CAAC,EAAE;IAClD,oBAAoB,IAAI,CAAC,+BAA+B,EAAE;IAC1D,oBAAoB,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACjD,oBAAoB;IACpB;IACA,gBAAgB,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,kBAAkB,CAAC;IACjG,gBAAgB,MAAM,iBAAiB,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC;IACnF,gBAAgB,IAAI,CAAC,+BAA+B,EAAE;IACtD,gBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,GAAG,IAAI,EAAE,EAAE,CAAC;IACxG,aAAa;IACb,YAAY,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACxF,YAAY,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;IACtC,SAAS,CAAC;IACV,QAAQ,OAAO,eAAe,EAAE;IAChC;IACA,IAAI,wBAAwB,GAAG;IAC/B,QAAQ,IAAI,CAAC,+BAA+B,EAAE;IAC9C,QAAQ,MAAM,mBAAmB,EAAE;IACnC;IACA,IAAI,OAAO,YAAY,CAAC,IAAI,EAAE;IAC9B,QAAQ,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI;IACtC,YAAY,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;IAC3C,YAAY,MAAM,CAAC,SAAS,GAAG,MAAM;IACrC,gBAAgB,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7D,gBAAgB,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC;IACpE,gBAAgB,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,eAAe;IAC7F,gBAAgB,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACzC,aAAa;IACb,YAAY,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;IACtC,SAAS,CAAC;IACV;IACA,IAAI,+BAA+B,GAAG;IACtC,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,WAAW,EAAE;IACpF,YAAY,IAAI;IAChB,gBAAgB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IACzC;IACA,YAAY,OAAO,MAAM,EAAE;IAC3B;IACA;IACA,QAAQ,IAAI,CAAC,aAAa,GAAG,qBAAqB,EAAE;IACpD,QAAQ,IAAI,CAAC,aAAa,GAAG,IAAI;IACjC,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE;IACxB;IACA;;ICxKO,MAAM,gBAAgB,SAASC,cAAS,CAAC;IAChD,IAAI,WAAW,GAAG;IAClB,QAAQ,KAAK,CAAC,GAAG,SAAS,CAAC;IAC3B,QAAQ,IAAI,CAAC,qBAAqB,GAAG,IAAI,iBAAiB,EAAE;IAC5D;IACA,IAAI,oBAAoB,GAAG;IAC3B,QAAQ,OAAO,iBAAiB,CAAC,oBAAoB,EAAE;IACvD;IACA,IAAI,2BAA2B,GAAG;IAClC,QAAQ,OAAO,iBAAiB,CAAC,2BAA2B,EAAE;IAC9D;IACA,IAAI,+BAA+B,GAAG;IACtC,QAAQ,OAAO,iBAAiB,CAAC,+BAA+B,EAAE;IAClE;IACA,IAAI,cAAc,GAAG;IACrB,QAAQ,OAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE;IAC1D;IACA,IAAI,aAAa,GAAG;IACpB,QAAQ,OAAO,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE;IACzD;IACA,IAAI,cAAc,GAAG;IACrB,QAAQ,OAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE;IAC1D;IACA,IAAI,eAAe,GAAG;IACtB,QAAQ,OAAO,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE;IAC3D;IACA,IAAI,gBAAgB,GAAG;IACvB,QAAQ,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE;IAC5D;IACA;;;;;;;;;;;;;;;"}
|