stream-chat-react 11.13.1 → 11.15.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/dist/{Window-44a85f63.js → Window-847d5d88.js} +13943 -397
- package/dist/browser.full-bundle.js +17317 -3876
- package/dist/browser.full-bundle.js.map +1 -1
- package/dist/browser.full-bundle.min.js +4 -4
- package/dist/browser.full-bundle.min.js.map +1 -1
- package/dist/components/Attachment/Audio.d.ts.map +1 -1
- package/dist/components/Attachment/Audio.js +7 -4
- package/dist/components/Attachment/Card.d.ts +1 -1
- package/dist/components/Attachment/Card.d.ts.map +1 -1
- package/dist/components/Attachment/Card.js +4 -2
- package/dist/components/Attachment/VoiceRecording.d.ts.map +1 -1
- package/dist/components/Attachment/VoiceRecording.js +6 -4
- package/dist/components/Attachment/audioSampling.d.ts +10 -0
- package/dist/components/Attachment/audioSampling.d.ts.map +1 -0
- package/dist/components/Attachment/audioSampling.js +83 -0
- package/dist/components/Attachment/components/FileSizeIndicator.js +2 -2
- package/dist/components/Attachment/components/WaveProgressBar.d.ts +3 -10
- package/dist/components/Attachment/components/WaveProgressBar.d.ts.map +1 -1
- package/dist/components/Attachment/components/WaveProgressBar.js +23 -90
- package/dist/components/Attachment/hooks/useAudioController.d.ts +11 -3
- package/dist/components/Attachment/hooks/useAudioController.d.ts.map +1 -1
- package/dist/components/Attachment/hooks/useAudioController.js +89 -26
- package/dist/components/Attachment/index.d.ts +1 -0
- package/dist/components/Attachment/index.d.ts.map +1 -1
- package/dist/components/Attachment/index.js +1 -0
- package/dist/components/Attachment/utils.d.ts +5 -3
- package/dist/components/Attachment/utils.d.ts.map +1 -1
- package/dist/components/Attachment/utils.js +1 -0
- package/dist/components/Channel/Channel.d.ts +5 -1
- package/dist/components/Channel/Channel.d.ts.map +1 -1
- package/dist/components/Channel/Channel.js +2 -0
- package/dist/components/ChannelSearch/SearchResults.d.ts +2 -2
- package/dist/components/ChannelSearch/SearchResults.d.ts.map +1 -1
- package/dist/components/ChannelSearch/SearchResults.js +1 -1
- package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +1 -1
- package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts.map +1 -1
- package/dist/components/ChannelSearch/hooks/useChannelSearch.js +1 -1
- package/dist/components/Emojis/EmojiPicker.d.ts +2 -2
- package/dist/components/Emojis/index.cjs.js +2 -3
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.d.ts +3 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.d.ts.map +1 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.js +24 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingButtons.d.ts +4 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingButtons.d.ts.map +1 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingButtons.js +5 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.d.ts +3 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.d.ts.map +1 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.js +47 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.d.ts +8 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.d.ts.map +1 -0
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.js +21 -0
- package/dist/components/MediaRecorder/AudioRecorder/RecordingTimer.d.ts +6 -0
- package/dist/components/MediaRecorder/AudioRecorder/RecordingTimer.d.ts.map +1 -0
- package/dist/components/MediaRecorder/AudioRecorder/RecordingTimer.js +9 -0
- package/dist/components/MediaRecorder/AudioRecorder/index.d.ts +4 -0
- package/dist/components/MediaRecorder/AudioRecorder/index.d.ts.map +1 -0
- package/dist/components/MediaRecorder/AudioRecorder/index.js +3 -0
- package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts +8 -0
- package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts.map +1 -0
- package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.js +21 -0
- package/dist/components/MediaRecorder/classes/AmplitudeRecorder.d.ts +55 -0
- package/dist/components/MediaRecorder/classes/AmplitudeRecorder.d.ts.map +1 -0
- package/dist/components/MediaRecorder/classes/AmplitudeRecorder.js +93 -0
- package/dist/components/MediaRecorder/classes/BrowserPermission.d.ts +23 -0
- package/dist/components/MediaRecorder/classes/BrowserPermission.d.ts.map +1 -0
- package/dist/components/MediaRecorder/classes/BrowserPermission.js +98 -0
- package/dist/components/MediaRecorder/classes/MediaRecorderController.d.ts +83 -0
- package/dist/components/MediaRecorder/classes/MediaRecorderController.d.ts.map +1 -0
- package/dist/components/MediaRecorder/classes/MediaRecorderController.js +313 -0
- package/dist/components/MediaRecorder/classes/index.d.ts +4 -0
- package/dist/components/MediaRecorder/classes/index.d.ts.map +1 -0
- package/dist/components/MediaRecorder/classes/index.js +2 -0
- package/dist/components/MediaRecorder/hooks/index.d.ts +2 -0
- package/dist/components/MediaRecorder/hooks/index.d.ts.map +1 -0
- package/dist/components/MediaRecorder/hooks/index.js +1 -0
- package/dist/components/MediaRecorder/hooks/useMediaRecorder.d.ts +20 -0
- package/dist/components/MediaRecorder/hooks/useMediaRecorder.d.ts.map +1 -0
- package/dist/components/MediaRecorder/hooks/useMediaRecorder.js +73 -0
- package/dist/components/MediaRecorder/index.d.ts +6 -0
- package/dist/components/MediaRecorder/index.d.ts.map +1 -0
- package/dist/components/MediaRecorder/index.js +5 -0
- package/dist/components/MediaRecorder/observable/BehaviorSubject.d.ts +11 -0
- package/dist/components/MediaRecorder/observable/BehaviorSubject.d.ts.map +1 -0
- package/dist/components/MediaRecorder/observable/BehaviorSubject.js +34 -0
- package/dist/components/MediaRecorder/observable/Observable.d.ts +18 -0
- package/dist/components/MediaRecorder/observable/Observable.d.ts.map +1 -0
- package/dist/components/MediaRecorder/observable/Observable.js +29 -0
- package/dist/components/MediaRecorder/observable/Observer.d.ts +10 -0
- package/dist/components/MediaRecorder/observable/Observer.d.ts.map +1 -0
- package/dist/components/MediaRecorder/observable/Observer.js +3 -0
- package/dist/components/MediaRecorder/observable/Subject.d.ts +16 -0
- package/dist/components/MediaRecorder/observable/Subject.d.ts.map +1 -0
- package/dist/components/MediaRecorder/observable/Subject.js +70 -0
- package/dist/components/MediaRecorder/observable/Subscription.d.ts +11 -0
- package/dist/components/MediaRecorder/observable/Subscription.d.ts.map +1 -0
- package/dist/components/MediaRecorder/observable/Subscription.js +13 -0
- package/dist/components/MediaRecorder/observable/index.d.ts +6 -0
- package/dist/components/MediaRecorder/observable/index.d.ts.map +1 -0
- package/dist/components/MediaRecorder/observable/index.js +5 -0
- package/dist/components/MediaRecorder/transcode/audioProcessing.d.ts +16 -0
- package/dist/components/MediaRecorder/transcode/audioProcessing.d.ts.map +1 -0
- package/dist/components/MediaRecorder/transcode/audioProcessing.js +51 -0
- package/dist/components/MediaRecorder/transcode/index.d.ts +8 -0
- package/dist/components/MediaRecorder/transcode/index.d.ts.map +1 -0
- package/dist/components/MediaRecorder/transcode/index.js +18 -0
- package/dist/components/MediaRecorder/transcode/mp3.d.ts +2 -0
- package/dist/components/MediaRecorder/transcode/mp3.d.ts.map +1 -0
- package/dist/components/MediaRecorder/transcode/mp3.js +53 -0
- package/dist/components/MediaRecorder/transcode/wav.d.ts +8 -0
- package/dist/components/MediaRecorder/transcode/wav.d.ts.map +1 -0
- package/dist/components/MediaRecorder/transcode/wav.js +117 -0
- package/dist/components/Message/MessageSimple.d.ts.map +1 -1
- package/dist/components/Message/MessageSimple.js +3 -2
- package/dist/components/MessageInput/AttachmentPreviewList.d.ts +2 -1
- package/dist/components/MessageInput/AttachmentPreviewList.d.ts.map +1 -1
- package/dist/components/MessageInput/AttachmentPreviewList.js +66 -20
- package/dist/components/MessageInput/CooldownTimer.d.ts.map +1 -1
- package/dist/components/MessageInput/CooldownTimer.js +4 -17
- package/dist/components/MessageInput/MessageInput.d.ts +10 -0
- package/dist/components/MessageInput/MessageInput.d.ts.map +1 -1
- package/dist/components/MessageInput/MessageInputFlat.d.ts.map +1 -1
- package/dist/components/MessageInput/MessageInputFlat.js +31 -9
- package/dist/components/MessageInput/MessageInputSmall.d.ts.map +1 -1
- package/dist/components/MessageInput/MessageInputSmall.js +3 -2
- package/dist/components/MessageInput/SendButton.d.ts +8 -0
- package/dist/components/MessageInput/SendButton.d.ts.map +1 -0
- package/dist/components/MessageInput/SendButton.js +9 -0
- package/dist/components/MessageInput/hooks/useAttachments.d.ts +5 -2
- package/dist/components/MessageInput/hooks/useAttachments.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/useAttachments.js +87 -3
- package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +12 -2
- package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +22 -7
- package/dist/components/MessageInput/hooks/useMessageInputState.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/useMessageInputState.js +31 -5
- package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts +2 -2
- package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/useSubmitHandler.js +15 -6
- package/dist/components/MessageInput/hooks/useTimeElapsed.d.ts +10 -0
- package/dist/components/MessageInput/hooks/useTimeElapsed.d.ts.map +1 -0
- package/dist/components/MessageInput/hooks/useTimeElapsed.js +30 -0
- package/dist/components/MessageInput/hooks/useTimer.d.ts +4 -0
- package/dist/components/MessageInput/hooks/useTimer.d.ts.map +1 -0
- package/dist/components/MessageInput/hooks/useTimer.js +20 -0
- package/dist/components/MessageInput/hooks/utils.d.ts +1 -0
- package/dist/components/MessageInput/hooks/utils.d.ts.map +1 -1
- package/dist/components/MessageInput/hooks/utils.js +24 -7
- package/dist/components/MessageInput/icons.d.ts +5 -6
- package/dist/components/MessageInput/icons.d.ts.map +1 -1
- package/dist/components/MessageInput/icons.js +13 -10
- package/dist/components/MessageInput/index.d.ts +1 -0
- package/dist/components/MessageInput/index.d.ts.map +1 -1
- package/dist/components/MessageInput/index.js +1 -0
- package/dist/components/MessageInput/types.d.ts +36 -1
- package/dist/components/MessageInput/types.d.ts.map +1 -1
- package/dist/components/ReactFileUtilities/types.d.ts +1 -0
- package/dist/components/ReactFileUtilities/types.d.ts.map +1 -1
- package/dist/components/ReactFileUtilities/utils.d.ts +9 -1
- package/dist/components/ReactFileUtilities/utils.d.ts.map +1 -1
- package/dist/components/ReactFileUtilities/utils.js +25 -0
- package/dist/components/Reactions/utils/utils.d.ts +2 -1
- package/dist/components/Reactions/utils/utils.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/constants/limits.d.ts +1 -0
- package/dist/constants/limits.d.ts.map +1 -1
- package/dist/constants/limits.js +1 -0
- package/dist/context/ComponentContext.d.ts +7 -4
- package/dist/context/ComponentContext.d.ts.map +1 -1
- package/dist/context/MessageInputContext.d.ts +4 -1
- package/dist/context/MessageInputContext.d.ts.map +1 -1
- package/dist/css/v2/index.css +3 -1
- package/dist/css/v2/index.layout.css +3 -1
- package/dist/i18n/Streami18n.d.ts +14 -0
- package/dist/i18n/Streami18n.d.ts.map +1 -1
- package/dist/i18n/de.json +14 -0
- package/dist/i18n/en.json +14 -0
- package/dist/i18n/es.json +14 -0
- package/dist/i18n/fr.json +14 -0
- package/dist/i18n/hi.json +14 -0
- package/dist/i18n/it.json +14 -0
- package/dist/i18n/ja.json +14 -0
- package/dist/i18n/ko.json +14 -0
- package/dist/i18n/nl.json +14 -0
- package/dist/i18n/pt.json +14 -0
- package/dist/i18n/ru.json +14 -0
- package/dist/i18n/tr.json +14 -0
- package/dist/index.cjs.js +22 -4
- package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +56 -8
- package/dist/scss/v2/AttachmentList/AttachmentList-theme.scss +22 -4
- package/dist/scss/v2/ImageCarousel/ImageCarousel-layout.scss +11 -2
- package/dist/scss/v2/ImageCarousel/ImageCarousel-theme.scss +14 -0
- package/dist/scss/v2/_global-theme-variables.scss +13 -13
- package/dist/utils/mergeDeep.d.ts +4 -0
- package/dist/utils/mergeDeep.d.ts.map +1 -0
- package/dist/utils/mergeDeep.js +5 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -3
- package/dist/components/MessageInput/hooks/useFileState.d.ts +0 -7
- package/dist/components/MessageInput/hooks/useFileState.d.ts.map +0 -1
- package/dist/components/MessageInput/hooks/useFileState.js +0 -8
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './RecordingPermissionDeniedNotification';
|
|
2
|
+
export * from './AudioRecorder';
|
|
3
|
+
export * from './hooks';
|
|
4
|
+
export { MediaRecordingState } from './classes/MediaRecorderController';
|
|
5
|
+
export { RecordingPermission } from './classes/BrowserPermission';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MediaRecorder/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAC;AACxD,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Subject } from './Subject';
|
|
2
|
+
import { ObserverOrNext } from './Observer';
|
|
3
|
+
import { Subscription } from './Subscription';
|
|
4
|
+
export declare class BehaviorSubject<T> extends Subject<T> {
|
|
5
|
+
private _value;
|
|
6
|
+
constructor(_value: T);
|
|
7
|
+
get value(): T;
|
|
8
|
+
subscribe(observerOrNext: ObserverOrNext<T>): Subscription;
|
|
9
|
+
next(value: T): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=BehaviorSubject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorSubject.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/observable/BehaviorSubject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,qBAAa,eAAe,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,CAAC;IAI7B,IAAI,KAAK,IAAI,CAAC,CAMb;IAED,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY;IAO1D,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;CAGrB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { __extends } from "tslib";
|
|
2
|
+
import { Subject } from './Subject';
|
|
3
|
+
import { createObserver } from './Observer';
|
|
4
|
+
var BehaviorSubject = /** @class */ (function (_super) {
|
|
5
|
+
__extends(BehaviorSubject, _super);
|
|
6
|
+
function BehaviorSubject(_value) {
|
|
7
|
+
var _this = _super.call(this) || this;
|
|
8
|
+
_this._value = _value;
|
|
9
|
+
return _this;
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(BehaviorSubject.prototype, "value", {
|
|
12
|
+
get: function () {
|
|
13
|
+
var _a = this, _value = _a._value, thrownError = _a.thrownError;
|
|
14
|
+
if (thrownError) {
|
|
15
|
+
throw thrownError;
|
|
16
|
+
}
|
|
17
|
+
return _value;
|
|
18
|
+
},
|
|
19
|
+
enumerable: false,
|
|
20
|
+
configurable: true
|
|
21
|
+
});
|
|
22
|
+
BehaviorSubject.prototype.subscribe = function (observerOrNext) {
|
|
23
|
+
var observer = createObserver(observerOrNext);
|
|
24
|
+
var subscription = _super.prototype.subscribe.call(this, observerOrNext);
|
|
25
|
+
if (!subscription.closed)
|
|
26
|
+
observer.next(this._value);
|
|
27
|
+
return subscription;
|
|
28
|
+
};
|
|
29
|
+
BehaviorSubject.prototype.next = function (value) {
|
|
30
|
+
_super.prototype.next.call(this, (this._value = value));
|
|
31
|
+
};
|
|
32
|
+
return BehaviorSubject;
|
|
33
|
+
}(Subject));
|
|
34
|
+
export { BehaviorSubject };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ObserverOrNext } from './Observer';
|
|
2
|
+
import { Subscription } from './Subscription';
|
|
3
|
+
export interface Unsubscribable {
|
|
4
|
+
unsubscribe(): void;
|
|
5
|
+
}
|
|
6
|
+
type Producer<T> = (observer: ObserverOrNext<T>) => Subscription;
|
|
7
|
+
export interface Subscribable<T> {
|
|
8
|
+
subscribe(observerOrNext: ObserverOrNext<T>): Unsubscribable;
|
|
9
|
+
}
|
|
10
|
+
export declare class Observable<T> implements Subscribable<T> {
|
|
11
|
+
protected _closed: boolean;
|
|
12
|
+
private _producer;
|
|
13
|
+
constructor(producer?: Producer<T>);
|
|
14
|
+
get closed(): boolean;
|
|
15
|
+
subscribe(observerOrNext: ObserverOrNext<T>): Subscription;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=Observable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Observable.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/observable/Observable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,WAAW,IAAI,IAAI,CAAC;CACrB;AAED,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC;AAEjE,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC;CAC9D;AAED,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IACnD,SAAS,CAAC,OAAO,UAAS;IAC1B,OAAO,CAAC,SAAS,CAA0B;gBAE/B,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAIlC,IAAI,MAAM,YAET;IAED,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY;CAS3D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { createObserver } from './Observer';
|
|
2
|
+
import { Subscription } from './Subscription';
|
|
3
|
+
var Observable = /** @class */ (function () {
|
|
4
|
+
function Observable(producer) {
|
|
5
|
+
this._closed = false;
|
|
6
|
+
if (producer)
|
|
7
|
+
this._producer = producer;
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(Observable.prototype, "closed", {
|
|
10
|
+
get: function () {
|
|
11
|
+
return this._closed;
|
|
12
|
+
},
|
|
13
|
+
enumerable: false,
|
|
14
|
+
configurable: true
|
|
15
|
+
});
|
|
16
|
+
Observable.prototype.subscribe = function (observerOrNext) {
|
|
17
|
+
var _this = this;
|
|
18
|
+
var _a;
|
|
19
|
+
var observer = createObserver(observerOrNext);
|
|
20
|
+
if (!this.closed) {
|
|
21
|
+
(_a = this._producer) === null || _a === void 0 ? void 0 : _a.call(this, observer);
|
|
22
|
+
}
|
|
23
|
+
return new Subscription(function () {
|
|
24
|
+
_this._closed = true;
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
return Observable;
|
|
28
|
+
}());
|
|
29
|
+
export { Observable };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type Next<T> = (value: T) => void;
|
|
2
|
+
export type Observer<T> = {
|
|
3
|
+
next(value: T): void;
|
|
4
|
+
complete?(): void;
|
|
5
|
+
error?(error: Error): void;
|
|
6
|
+
};
|
|
7
|
+
export type ObserverOrNext<T> = Next<T> | Observer<T>;
|
|
8
|
+
export declare function createObserver<T>(observerOrNext: ObserverOrNext<T>): Observer<T>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=Observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/observable/Observer.ts"],"names":[],"mappings":"AAAA,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAClC,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,IAAI,IAAI,CAAC;IAClB,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC5B,CAAC;AACF,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEtD,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAEhF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Observable } from './Observable';
|
|
2
|
+
import { Subscription, SubscriptionLike } from './Subscription';
|
|
3
|
+
import { Observer, ObserverOrNext } from './Observer';
|
|
4
|
+
export declare class Subject<T> extends Observable<T> implements SubscriptionLike {
|
|
5
|
+
private _observers;
|
|
6
|
+
private _observerCounter;
|
|
7
|
+
thrownError: Error | undefined;
|
|
8
|
+
constructor();
|
|
9
|
+
get observers(): Observer<T>[];
|
|
10
|
+
next(value: T): void;
|
|
11
|
+
error(err: Error): void;
|
|
12
|
+
complete(): void;
|
|
13
|
+
subscribe(observerOrNext: ObserverOrNext<T>): Subscription;
|
|
14
|
+
unsubscribe(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Subject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Subject.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/observable/Subject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAkB,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEtE,qBAAa,OAAO,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,gBAAgB;IACvE,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,WAAW,EAAE,KAAK,GAAG,SAAS,CAAC;;IAM/B,IAAI,SAAS,kBAEZ;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;IAQb,KAAK,CAAC,GAAG,EAAE,KAAK;IAUhB,QAAQ;IAUR,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY;IAe1D,WAAW,IAAI,IAAI;CAIpB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { __extends } from "tslib";
|
|
2
|
+
import { Observable } from './Observable';
|
|
3
|
+
import { Subscription } from './Subscription';
|
|
4
|
+
import { createObserver } from './Observer';
|
|
5
|
+
var Subject = /** @class */ (function (_super) {
|
|
6
|
+
__extends(Subject, _super);
|
|
7
|
+
function Subject() {
|
|
8
|
+
var _this = _super.call(this) || this;
|
|
9
|
+
_this._observers = new Map();
|
|
10
|
+
_this._observerCounter = 0;
|
|
11
|
+
return _this;
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(Subject.prototype, "observers", {
|
|
14
|
+
get: function () {
|
|
15
|
+
return Array.from(this._observers.values());
|
|
16
|
+
},
|
|
17
|
+
enumerable: false,
|
|
18
|
+
configurable: true
|
|
19
|
+
});
|
|
20
|
+
Subject.prototype.next = function (value) {
|
|
21
|
+
if (this.closed)
|
|
22
|
+
return;
|
|
23
|
+
var observers = this.observers;
|
|
24
|
+
for (var i = 0; i < observers.length; i++) {
|
|
25
|
+
observers[i].next(value);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
Subject.prototype.error = function (err) {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
if (this.closed)
|
|
31
|
+
return;
|
|
32
|
+
this.thrownError = err;
|
|
33
|
+
var observers = this.observers;
|
|
34
|
+
for (var i = 0; i < observers.length; i++) {
|
|
35
|
+
(_b = (_a = observers[i]).error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
|
|
36
|
+
}
|
|
37
|
+
this._observers.clear();
|
|
38
|
+
};
|
|
39
|
+
Subject.prototype.complete = function () {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
if (this.closed)
|
|
42
|
+
return;
|
|
43
|
+
this._closed = true;
|
|
44
|
+
var observers = this.observers;
|
|
45
|
+
for (var i = 0; i < observers.length; i++) {
|
|
46
|
+
(_b = (_a = observers[i]).complete) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
47
|
+
}
|
|
48
|
+
this._observers.clear();
|
|
49
|
+
};
|
|
50
|
+
Subject.prototype.subscribe = function (observerOrNext) {
|
|
51
|
+
var _this = this;
|
|
52
|
+
var observer = createObserver(observerOrNext);
|
|
53
|
+
if (this.thrownError || this.closed) {
|
|
54
|
+
var subscription = new Subscription();
|
|
55
|
+
subscription.closed = true;
|
|
56
|
+
return subscription;
|
|
57
|
+
}
|
|
58
|
+
var observerId = this._observerCounter++;
|
|
59
|
+
this._observers.set(observerId, observer);
|
|
60
|
+
return new Subscription(function () {
|
|
61
|
+
_this._observers.delete(observerId);
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
Subject.prototype.unsubscribe = function () {
|
|
65
|
+
this._closed = true;
|
|
66
|
+
this._observers.clear();
|
|
67
|
+
};
|
|
68
|
+
return Subject;
|
|
69
|
+
}(Observable));
|
|
70
|
+
export { Subject };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface SubscriptionLike {
|
|
2
|
+
closed: boolean;
|
|
3
|
+
unsubscribe(): void;
|
|
4
|
+
}
|
|
5
|
+
export declare class Subscription implements SubscriptionLike {
|
|
6
|
+
closed: boolean;
|
|
7
|
+
private _unsubscribe;
|
|
8
|
+
constructor(unsubscribe?: () => void);
|
|
9
|
+
unsubscribe(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Subscription.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/observable/Subscription.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAEhB,WAAW,IAAI,IAAI,CAAC;CACrB;AAED,qBAAa,YAAa,YAAW,gBAAgB;IACnD,MAAM,UAAS;IACf,OAAO,CAAC,YAAY,CAA2B;gBAEnC,WAAW,CAAC,EAAE,MAAM,IAAI;IAIpC,WAAW;CAIZ"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
var Subscription = /** @class */ (function () {
|
|
2
|
+
function Subscription(unsubscribe) {
|
|
3
|
+
this.closed = false;
|
|
4
|
+
this._unsubscribe = unsubscribe;
|
|
5
|
+
}
|
|
6
|
+
Subscription.prototype.unsubscribe = function () {
|
|
7
|
+
var _a;
|
|
8
|
+
this.closed = true;
|
|
9
|
+
(_a = this._unsubscribe) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
10
|
+
};
|
|
11
|
+
return Subscription;
|
|
12
|
+
}());
|
|
13
|
+
export { Subscription };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/observable/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In the context of resampling audio data, AudioContext is used to decode the input audio file into an AudioBuffer,
|
|
3
|
+
* which is a fundamental data structure representing audio data.
|
|
4
|
+
* @param file
|
|
5
|
+
*/
|
|
6
|
+
export declare const toAudioBuffer: (file: File) => Promise<AudioBuffer>;
|
|
7
|
+
/**
|
|
8
|
+
* OfflineAudioContext is a specialized type of AudioContext that does not render audio in real-time and is used for offline audio processing tasks.
|
|
9
|
+
* It allows performing audio processing and rendering without actually playing the audio through speakers or outputting it to a destination.
|
|
10
|
+
* In the context of resampling audio data, OfflineAudioContext is used to resample the decoded AudioBuffer from a file to the desired sample rate.
|
|
11
|
+
* It provides more flexibility and control over audio processing, as it can operate at different sample rates and durations compared to real-time audio contexts.
|
|
12
|
+
* @param audioBuffer
|
|
13
|
+
* @param sampleRate
|
|
14
|
+
*/
|
|
15
|
+
export declare const renderAudio: (audioBuffer: AudioBuffer, sampleRate: number) => Promise<AudioBuffer>;
|
|
16
|
+
//# sourceMappingURL=audioProcessing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioProcessing.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/transcode/audioProcessing.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,aAAa,SAAgB,IAAI,yBAO7C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,gBAAuB,WAAW,cAAc,MAAM,yBAY7E,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import { readFileAsArrayBuffer } from '../../ReactFileUtilities';
|
|
3
|
+
/**
|
|
4
|
+
* In the context of resampling audio data, AudioContext is used to decode the input audio file into an AudioBuffer,
|
|
5
|
+
* which is a fundamental data structure representing audio data.
|
|
6
|
+
* @param file
|
|
7
|
+
*/
|
|
8
|
+
export var toAudioBuffer = function (file) { return __awaiter(void 0, void 0, void 0, function () {
|
|
9
|
+
var audioCtx, arrayBuffer, decodedData;
|
|
10
|
+
return __generator(this, function (_a) {
|
|
11
|
+
switch (_a.label) {
|
|
12
|
+
case 0:
|
|
13
|
+
audioCtx = new AudioContext();
|
|
14
|
+
return [4 /*yield*/, readFileAsArrayBuffer(file)];
|
|
15
|
+
case 1:
|
|
16
|
+
arrayBuffer = _a.sent();
|
|
17
|
+
return [4 /*yield*/, audioCtx.decodeAudioData(arrayBuffer)];
|
|
18
|
+
case 2:
|
|
19
|
+
decodedData = _a.sent();
|
|
20
|
+
if (!(audioCtx.state !== 'closed')) return [3 /*break*/, 4];
|
|
21
|
+
return [4 /*yield*/, audioCtx.close()];
|
|
22
|
+
case 3:
|
|
23
|
+
_a.sent();
|
|
24
|
+
_a.label = 4;
|
|
25
|
+
case 4: return [2 /*return*/, decodedData];
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}); };
|
|
29
|
+
/**
|
|
30
|
+
* OfflineAudioContext is a specialized type of AudioContext that does not render audio in real-time and is used for offline audio processing tasks.
|
|
31
|
+
* It allows performing audio processing and rendering without actually playing the audio through speakers or outputting it to a destination.
|
|
32
|
+
* In the context of resampling audio data, OfflineAudioContext is used to resample the decoded AudioBuffer from a file to the desired sample rate.
|
|
33
|
+
* It provides more flexibility and control over audio processing, as it can operate at different sample rates and durations compared to real-time audio contexts.
|
|
34
|
+
* @param audioBuffer
|
|
35
|
+
* @param sampleRate
|
|
36
|
+
*/
|
|
37
|
+
export var renderAudio = function (audioBuffer, sampleRate) { return __awaiter(void 0, void 0, void 0, function () {
|
|
38
|
+
var offlineAudioCtx, source;
|
|
39
|
+
return __generator(this, function (_a) {
|
|
40
|
+
switch (_a.label) {
|
|
41
|
+
case 0:
|
|
42
|
+
offlineAudioCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.duration * sampleRate, sampleRate);
|
|
43
|
+
source = offlineAudioCtx.createBufferSource();
|
|
44
|
+
source.buffer = audioBuffer;
|
|
45
|
+
source.connect(offlineAudioCtx.destination);
|
|
46
|
+
source.start();
|
|
47
|
+
return [4 /*yield*/, offlineAudioCtx.startRendering()];
|
|
48
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}); };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/transcode/index.ts"],"names":[],"mappings":"AAIA,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AACF,eAAO,MAAM,SAAS,yCAA0C,eAAe,KAAG,QAAQ,IAAI,CAe7F,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { encodeToWaw } from './wav';
|
|
2
|
+
import { encodeToMp3 } from './mp3';
|
|
3
|
+
import { createFileFromBlobs, getExtensionFromMimeType } from '../../ReactFileUtilities';
|
|
4
|
+
export var transcode = function (_a) {
|
|
5
|
+
var blob = _a.blob, sampleRate = _a.sampleRate, targetMimeType = _a.targetMimeType;
|
|
6
|
+
var file = createFileFromBlobs({
|
|
7
|
+
blobsArray: [blob],
|
|
8
|
+
fileName: "audio_recording_".concat(new Date().toISOString(), ".").concat(getExtensionFromMimeType(blob.type)),
|
|
9
|
+
mimeType: blob.type,
|
|
10
|
+
});
|
|
11
|
+
if (targetMimeType.match('audio/wav')) {
|
|
12
|
+
return encodeToWaw(file, sampleRate);
|
|
13
|
+
}
|
|
14
|
+
if (targetMimeType.match('audio/mp3')) {
|
|
15
|
+
return encodeToMp3(file, sampleRate);
|
|
16
|
+
}
|
|
17
|
+
return Promise.resolve(blob);
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mp3.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/transcode/mp3.ts"],"names":[],"mappings":"AAuBA,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAuB/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import { Mp3Encoder } from '@breezystack/lamejs';
|
|
3
|
+
import { renderAudio, toAudioBuffer } from './audioProcessing';
|
|
4
|
+
var ENCODING_BIT_RATE = 128; // kbps;
|
|
5
|
+
var COUNT_SAMPLES_PER_ENCODED_BLOCK = 1152;
|
|
6
|
+
var float32ArrayToInt16Array = function (float32Arr) {
|
|
7
|
+
var int16Arr = new Int16Array(float32Arr.length);
|
|
8
|
+
for (var i = 0; i < float32Arr.length; i++) {
|
|
9
|
+
var float32Value = float32Arr[i];
|
|
10
|
+
// Clamp the float value between -1 and 1
|
|
11
|
+
var clampedValue = Math.max(-1, Math.min(1, float32Value));
|
|
12
|
+
// Convert the float value to a signed 16-bit integer
|
|
13
|
+
int16Arr[i] = Math.round(clampedValue * 32767);
|
|
14
|
+
}
|
|
15
|
+
return int16Arr;
|
|
16
|
+
};
|
|
17
|
+
var splitDataByChannel = function (audioBuffer) {
|
|
18
|
+
return Array.from({ length: audioBuffer.numberOfChannels }, function (_, i) { return audioBuffer.getChannelData(i); }).map(float32ArrayToInt16Array);
|
|
19
|
+
};
|
|
20
|
+
export function encodeToMp3(file, sampleRate) {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
22
|
+
var audioBuffer, _a, channelCount, dataByChannel, mp3Encoder, dataBuffer, remaining, _loop_1, i, lastBlock;
|
|
23
|
+
return __generator(this, function (_b) {
|
|
24
|
+
switch (_b.label) {
|
|
25
|
+
case 0:
|
|
26
|
+
_a = renderAudio;
|
|
27
|
+
return [4 /*yield*/, toAudioBuffer(file)];
|
|
28
|
+
case 1: return [4 /*yield*/, _a.apply(void 0, [_b.sent(), sampleRate])];
|
|
29
|
+
case 2:
|
|
30
|
+
audioBuffer = _b.sent();
|
|
31
|
+
channelCount = audioBuffer.numberOfChannels;
|
|
32
|
+
dataByChannel = splitDataByChannel(audioBuffer);
|
|
33
|
+
mp3Encoder = new Mp3Encoder(channelCount, sampleRate, ENCODING_BIT_RATE);
|
|
34
|
+
dataBuffer = [];
|
|
35
|
+
remaining = dataByChannel[0].length;
|
|
36
|
+
_loop_1 = function (i) {
|
|
37
|
+
var _c = dataByChannel.map(function (channel) {
|
|
38
|
+
return channel.subarray(i, i + COUNT_SAMPLES_PER_ENCODED_BLOCK);
|
|
39
|
+
}), leftChannelBlock = _c[0], rightChannelBlock = _c[1];
|
|
40
|
+
dataBuffer.push(new Int8Array(mp3Encoder.encodeBuffer(leftChannelBlock, rightChannelBlock)));
|
|
41
|
+
remaining -= COUNT_SAMPLES_PER_ENCODED_BLOCK;
|
|
42
|
+
};
|
|
43
|
+
for (i = 0; remaining >= COUNT_SAMPLES_PER_ENCODED_BLOCK; i += COUNT_SAMPLES_PER_ENCODED_BLOCK) {
|
|
44
|
+
_loop_1(i);
|
|
45
|
+
}
|
|
46
|
+
lastBlock = mp3Encoder.flush();
|
|
47
|
+
if (lastBlock.length)
|
|
48
|
+
dataBuffer.push(new Int8Array(lastBlock));
|
|
49
|
+
return [2 /*return*/, new Blob(dataBuffer, { type: 'audio/mp3;sbu_type=voice' })];
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const readWavHeader: (dataView: DataView) => {
|
|
2
|
+
audioDataSizeBytes: number;
|
|
3
|
+
audioDataStartOffset: 44;
|
|
4
|
+
channelCount: number;
|
|
5
|
+
sampleRate: number;
|
|
6
|
+
} | undefined;
|
|
7
|
+
export declare const encodeToWaw: (file: File, sampleRate: number) => Promise<Blob>;
|
|
8
|
+
//# sourceMappingURL=wav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wav.d.ts","sourceRoot":"","sources":["../../../../src/components/MediaRecorder/transcode/wav.ts"],"names":[],"mappings":"AAyEA,eAAO,MAAM,aAAa,aAAc,QAAQ;;;;;aAqB/C,CAAC;AAkCF,eAAO,MAAM,WAAW,SAAgB,IAAI,cAAc,MAAM,kBAU/D,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import { renderAudio, toAudioBuffer } from './audioProcessing';
|
|
3
|
+
var WAV_HEADER_LENGTH_BYTES = 44;
|
|
4
|
+
var BYTES_PER_SAMPLE = 2;
|
|
5
|
+
var RIFF_FILE_MAX_BYTES = 4294967295;
|
|
6
|
+
var HEADER = {
|
|
7
|
+
AUDIO_FORMAT: { offset: 20, value: 1 },
|
|
8
|
+
BITS_PER_SAMPLE: { offset: 34, value: BYTES_PER_SAMPLE * 8 },
|
|
9
|
+
BLOCK_ALIGN: { offset: 32 },
|
|
10
|
+
BYTE_RATE: { offset: 28 },
|
|
11
|
+
CHANNEL_COUNT: { offset: 22 },
|
|
12
|
+
CHUNK_ID: { offset: 0, value: 0x52494646 },
|
|
13
|
+
CHUNK_SIZE: { offset: 4 },
|
|
14
|
+
FILE_FORMAT: { offset: 8, value: 0x57415645 },
|
|
15
|
+
SAMPLE_RATE: { offset: 24 },
|
|
16
|
+
SUBCHUNK1_ID: { offset: 12, value: 0x666d7420 },
|
|
17
|
+
SUBCHUNK1_SIZE: { offset: 16, value: 16 },
|
|
18
|
+
SUBCHUNK2_ID: { offset: 36, value: 0x64617461 },
|
|
19
|
+
SUBCHUNK2_SIZE: { offset: 40 }, // actual audio data size
|
|
20
|
+
};
|
|
21
|
+
var fourCharsToInt = function (chars) {
|
|
22
|
+
return (chars.charCodeAt(0) << 24) |
|
|
23
|
+
(chars.charCodeAt(1) << 16) |
|
|
24
|
+
(chars.charCodeAt(2) << 8) |
|
|
25
|
+
chars.charCodeAt(3);
|
|
26
|
+
};
|
|
27
|
+
var WAV_HEADER_FLAGS = {
|
|
28
|
+
data: fourCharsToInt('data'),
|
|
29
|
+
fmt: fourCharsToInt('fmt '),
|
|
30
|
+
RIFF: fourCharsToInt('RIFF'),
|
|
31
|
+
WAVE: fourCharsToInt('WAVE'),
|
|
32
|
+
};
|
|
33
|
+
var writeWavHeader = function (_a) {
|
|
34
|
+
var arrayBuffer = _a.arrayBuffer, channelCount = _a.channelCount, sampleRate = _a.sampleRate;
|
|
35
|
+
var byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec
|
|
36
|
+
var blockAlign = channelCount * BYTES_PER_SAMPLE;
|
|
37
|
+
var dataView = new DataView(arrayBuffer);
|
|
38
|
+
/*
|
|
39
|
+
* The maximum size of a RIFF file is 4294967295 bytes and since the header takes up 44 bytes there are 4294967251 bytes left for the
|
|
40
|
+
* data chunk.
|
|
41
|
+
*/
|
|
42
|
+
var dataChunkSize = Math.min(dataView.byteLength - WAV_HEADER_LENGTH_BYTES, RIFF_FILE_MAX_BYTES - WAV_HEADER_LENGTH_BYTES);
|
|
43
|
+
dataView.setUint32(HEADER.CHUNK_ID.offset, HEADER.CHUNK_ID.value); // "RIFF"
|
|
44
|
+
dataView.setUint32(HEADER.CHUNK_SIZE.offset, arrayBuffer.byteLength - 8, true); // adjustment for the first two headers - chunk id + file size
|
|
45
|
+
dataView.setUint32(HEADER.FILE_FORMAT.offset, HEADER.FILE_FORMAT.value); // "WAVE"
|
|
46
|
+
dataView.setUint32(HEADER.SUBCHUNK1_ID.offset, HEADER.SUBCHUNK1_ID.value); // "fmt "
|
|
47
|
+
dataView.setUint32(HEADER.SUBCHUNK1_SIZE.offset, HEADER.SUBCHUNK1_SIZE.value, true);
|
|
48
|
+
dataView.setUint16(HEADER.AUDIO_FORMAT.offset, HEADER.AUDIO_FORMAT.value, true);
|
|
49
|
+
dataView.setUint16(HEADER.CHANNEL_COUNT.offset, channelCount, true);
|
|
50
|
+
dataView.setUint32(HEADER.SAMPLE_RATE.offset, sampleRate, true);
|
|
51
|
+
dataView.setUint32(HEADER.BYTE_RATE.offset, byteRate, true);
|
|
52
|
+
dataView.setUint16(HEADER.BLOCK_ALIGN.offset, blockAlign, true);
|
|
53
|
+
dataView.setUint16(HEADER.BITS_PER_SAMPLE.offset, HEADER.BITS_PER_SAMPLE.value, true);
|
|
54
|
+
dataView.setUint32(HEADER.SUBCHUNK2_ID.offset, HEADER.SUBCHUNK2_ID.value); // "data"
|
|
55
|
+
dataView.setUint32(HEADER.SUBCHUNK2_SIZE.offset, dataChunkSize, true);
|
|
56
|
+
};
|
|
57
|
+
export var readWavHeader = function (dataView) {
|
|
58
|
+
var header = dataView.getUint32(0, false);
|
|
59
|
+
if (WAV_HEADER_FLAGS.RIFF !== header) {
|
|
60
|
+
console.error('Missing RIFF header in WAVE file');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (WAV_HEADER_FLAGS.WAVE !== dataView.getUint32(HEADER.FILE_FORMAT.offset, false)) {
|
|
64
|
+
console.error('Missing WAVE header in WAVE file');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (WAV_HEADER_FLAGS.fmt !== dataView.getUint32(HEADER.SUBCHUNK1_ID.offset, false)) {
|
|
68
|
+
console.error('Missing fmt header in WAVE file');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
audioDataSizeBytes: dataView.getUint32(HEADER.SUBCHUNK2_SIZE.offset, true),
|
|
73
|
+
audioDataStartOffset: WAV_HEADER_LENGTH_BYTES,
|
|
74
|
+
channelCount: dataView.getUint16(HEADER.CHANNEL_COUNT.offset, true),
|
|
75
|
+
sampleRate: dataView.getUint32(HEADER.SAMPLE_RATE.offset, true),
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
var splitDataByChannel = function (audioBuffer) {
|
|
79
|
+
return Array.from({ length: audioBuffer.numberOfChannels }, function (_, i) { return audioBuffer.getChannelData(i); });
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* In a WAV file, samples for each channel are usually interleaved, meaning samples from each channel are grouped together sequentially.
|
|
83
|
+
* For example, in a stereo audio file (2 channels), samples alternate between the left and right channels.
|
|
84
|
+
* @param arrayBuffer
|
|
85
|
+
* @param dataByChannel
|
|
86
|
+
*/
|
|
87
|
+
var writeWavAudioData = function (_a) {
|
|
88
|
+
var arrayBuffer = _a.arrayBuffer, dataByChannel = _a.dataByChannel;
|
|
89
|
+
var dataView = new DataView(arrayBuffer);
|
|
90
|
+
var channelCount = dataByChannel.length;
|
|
91
|
+
dataByChannel.forEach(function (channelData, channelIndex) {
|
|
92
|
+
var writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;
|
|
93
|
+
channelData.forEach(function (float32Value) {
|
|
94
|
+
dataView.setInt16(writeOffset, float32Value < 0 ? Math.max(-1, float32Value) * 32768 : Math.min(1, float32Value) * 32767, true);
|
|
95
|
+
writeOffset += channelCount * BYTES_PER_SAMPLE;
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
export var encodeToWaw = function (file, sampleRate) { return __awaiter(void 0, void 0, void 0, function () {
|
|
100
|
+
var audioBuffer, _a, numberOfSamples, fileSizeBytes, arrayBuffer;
|
|
101
|
+
return __generator(this, function (_b) {
|
|
102
|
+
switch (_b.label) {
|
|
103
|
+
case 0:
|
|
104
|
+
_a = renderAudio;
|
|
105
|
+
return [4 /*yield*/, toAudioBuffer(file)];
|
|
106
|
+
case 1: return [4 /*yield*/, _a.apply(void 0, [_b.sent(), sampleRate])];
|
|
107
|
+
case 2:
|
|
108
|
+
audioBuffer = _b.sent();
|
|
109
|
+
numberOfSamples = audioBuffer.duration * sampleRate;
|
|
110
|
+
fileSizeBytes = numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE + WAV_HEADER_LENGTH_BYTES;
|
|
111
|
+
arrayBuffer = new ArrayBuffer(fileSizeBytes);
|
|
112
|
+
writeWavHeader({ arrayBuffer: arrayBuffer, channelCount: audioBuffer.numberOfChannels, sampleRate: sampleRate });
|
|
113
|
+
writeWavAudioData({ arrayBuffer: arrayBuffer, dataByChannel: splitDataByChannel(audioBuffer) });
|
|
114
|
+
return [2 /*return*/, new Blob([arrayBuffer], { type: 'audio/wav' })];
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}); };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageSimple.d.ts","sourceRoot":"","sources":["../../../src/components/Message/MessageSimple.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAgCxC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,8BAA8B,CAAC;AAEtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageSimple.d.ts","sourceRoot":"","sources":["../../../src/components/Message/MessageSimple.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAgCxC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,8BAA8B,CAAC;AAEtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AA6NnE;;GAEG;AACH,eAAO,MAAM,aAAa,kKAQzB,CAAC"}
|
|
@@ -28,7 +28,7 @@ var MessageSimpleWithContext = function (props) {
|
|
|
28
28
|
var t = useTranslationContext('MessageSimple').t;
|
|
29
29
|
var _b = useState(false), isBounceDialogOpen = _b[0], setIsBounceDialogOpen = _b[1];
|
|
30
30
|
var _c = useState(false), isEditedTimestampOpen = _c[0], setEditedTimestampOpen = _c[1];
|
|
31
|
-
var _d = useComponentContext('MessageSimple'), Attachment = _d.Attachment, _e = _d.Avatar, Avatar = _e === void 0 ? DefaultAvatar : _e, _f = _d.EditMessageInput, EditMessageInput = _f === void 0 ? DefaultEditMessageForm : _f, _g = _d.MessageDeleted, MessageDeleted = _g === void 0 ? DefaultMessageDeleted : _g, _h = _d.MessageBouncePrompt, MessageBouncePrompt = _h === void 0 ? DefaultMessageBouncePrompt : _h, _j = _d.MessageOptions, MessageOptions = _j === void 0 ? DefaultMessageOptions : _j, _k = _d.MessageRepliesCountButton, MessageRepliesCountButton = _k === void 0 ? DefaultMessageRepliesCountButton : _k, _l = _d.MessageStatus, MessageStatus = _l === void 0 ? DefaultMessageStatus : _l, _m = _d.MessageTimestamp, MessageTimestamp = _m === void 0 ? DefaultMessageTimestamp : _m, _o = _d.ReactionSelector, ReactionSelector = _o === void 0 ? DefaultReactionSelector : _o, _p = _d.ReactionsList, ReactionsList = _p === void 0 ? DefaultReactionList : _p;
|
|
31
|
+
var _d = useComponentContext('MessageSimple'), Attachment = _d.Attachment, _e = _d.Avatar, Avatar = _e === void 0 ? DefaultAvatar : _e, _f = _d.EditMessageInput, EditMessageInput = _f === void 0 ? DefaultEditMessageForm : _f, _g = _d.MessageDeleted, MessageDeleted = _g === void 0 ? DefaultMessageDeleted : _g, _h = _d.MessageBouncePrompt, MessageBouncePrompt = _h === void 0 ? DefaultMessageBouncePrompt : _h, _j = _d.MessageOptions, MessageOptions = _j === void 0 ? DefaultMessageOptions : _j, _k = _d.MessageRepliesCountButton, MessageRepliesCountButton = _k === void 0 ? DefaultMessageRepliesCountButton : _k, _l = _d.MessageStatus, MessageStatus = _l === void 0 ? DefaultMessageStatus : _l, _m = _d.MessageTimestamp, MessageTimestamp = _m === void 0 ? DefaultMessageTimestamp : _m, _o = _d.ReactionSelector, ReactionSelector = _o === void 0 ? DefaultReactionSelector : _o, _p = _d.ReactionsList, ReactionsList = _p === void 0 ? DefaultReactionList : _p, PinIndicator = _d.PinIndicator;
|
|
32
32
|
var themeVersion = useChatContext('MessageSimple').themeVersion;
|
|
33
33
|
var hasAttachment = messageHasAttachments(message);
|
|
34
34
|
var hasReactions = messageHasReactions(message);
|
|
@@ -63,9 +63,9 @@ var MessageSimpleWithContext = function (props) {
|
|
|
63
63
|
var rootClassName = clsx('str-chat__message str-chat__message-simple', "str-chat__message--".concat(message.type), "str-chat__message--".concat(message.status), isMyMessage()
|
|
64
64
|
? 'str-chat__message--me str-chat__message-simple--me'
|
|
65
65
|
: 'str-chat__message--other', message.text ? 'str-chat__message--has-text' : 'has-no-text', {
|
|
66
|
-
'pinned-message': message.pinned,
|
|
67
66
|
'str-chat__message--has-attachment': hasAttachment,
|
|
68
67
|
'str-chat__message--highlighted': highlighted,
|
|
68
|
+
'str-chat__message--pinned pinned-message': message.pinned,
|
|
69
69
|
'str-chat__message--with-reactions str-chat__message-with-thread-link': canShowReactions,
|
|
70
70
|
'str-chat__message-send-can-be-retried': (message === null || message === void 0 ? void 0 : message.status) === 'failed' && (message === null || message === void 0 ? void 0 : message.errorStatusCode) !== 403,
|
|
71
71
|
'str-chat__virtual-message__wrapper--end': endOfGroup,
|
|
@@ -77,6 +77,7 @@ var MessageSimpleWithContext = function (props) {
|
|
|
77
77
|
React.createElement(MessageInput, __assign({ clearEditingState: clearEditingState, grow: true, hideSendButton: true, Input: EditMessageInput, message: message }, additionalMessageInputProps)))),
|
|
78
78
|
isBounceDialogOpen && (React.createElement(MessageBounceModal, { MessageBouncePrompt: MessageBouncePrompt, onClose: function () { return setIsBounceDialogOpen(false); }, open: isBounceDialogOpen })),
|
|
79
79
|
React.createElement("div", { className: rootClassName, key: message.id },
|
|
80
|
+
PinIndicator && React.createElement(PinIndicator, null),
|
|
80
81
|
themeVersion === '1' && React.createElement(MessageStatus, null),
|
|
81
82
|
message.user && (React.createElement(Avatar, { image: message.user.image, name: message.user.name || message.user.id, onClick: onUserClick, onMouseOver: onUserHover, user: message.user })),
|
|
82
83
|
React.createElement("div", { className: clsx('str-chat__message-inner', {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
2
|
+
import type { DefaultStreamChatGenerics } from '../../types';
|
|
3
|
+
export declare const AttachmentPreviewList: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>() => React.JSX.Element;
|
|
3
4
|
type PreviewItemProps = {
|
|
4
5
|
id: string;
|
|
5
6
|
};
|