@linkbox/mediasoup-translate-client
Version:
118 lines • 5.33 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.translateTrack = exports.supportedLanguages = void 0;
const axios_1 = __importDefault(require("axios"));
const mediasoup_api_client_1 = require("./mediasoup-api-client");
/**
* in sync with live-translate-service
*/
exports.supportedLanguages = [
'German',
'English',
'Spanish',
'French',
'Russian',
'Italian',
'Ukrainian',
];
const translateTrack = (options) => __awaiter(void 0, void 0, void 0, function* () {
return new Promise((resolve) => __awaiter(void 0, void 0, void 0, function* () {
const { device, sourceTrack, sourceLanguage, targetLanguage, apiToken, apiUrl = 'http://live-translate-api.cloud-services.linkbox.de:8000', } = options;
console.log('client: starting');
const routerRtpCapabilities = yield axios_1.default
.get(`${apiUrl}/rtp-capabilities`)
.then((res) => res.data);
if (!device.loaded) {
yield device.load({
routerRtpCapabilities,
});
}
console.log('client: loaded device, can produce audio:', device.canProduce('audio'));
const sendTransport = yield (0, mediasoup_api_client_1.createTransport)(device, 'send', apiUrl, apiToken);
console.log('client: created send transport on server', sendTransport.id);
// "produce" is emitted upon each call to transport.produce()
sendTransport.on('produce', (data, callback, errback) => __awaiter(void 0, void 0, void 0, function* () {
console.log('client: producing', data.rtpParameters);
console.log(`[POST] "${apiUrl}/transports/${sendTransport.id}/translation-producer"`);
const producer = yield axios_1.default
.post(`${apiUrl}/transports/${sendTransport.id}/translation-producer`, {
kind: 'audio',
rtpParameters: data.rtpParameters,
apiToken,
sourceLanguage,
targetLanguage,
})
.then((res) => {
return res.data;
})
.catch((err) => {
console.error('client: error creating producer', err);
errback(err);
});
console.log('client: produced', producer);
callback({ id: producer.producerId });
}));
if (!device.canProduce('audio')) {
console.error('client: cannot produce audio');
return;
}
sendTransport.observer.on('newproducer', (producer) => {
console.log('new producer created [id:%s]', producer.id);
});
const producer = yield sendTransport.produce({
track: sourceTrack,
});
console.log('GOT PRODUCER', producer.id);
producer.on('trackended', () => {
console.log('TRACK ENDED');
});
producer.on('transportclose', () => {
console.log('TRANSPORT CLOSED!');
});
/////////////// CONSUME ////////////////
const recvTransport = yield (0, mediasoup_api_client_1.createTransport)(device, 'recv', apiUrl, apiToken);
recvTransport.observer.on('newconsumer', (consumer) => {
console.log('new consumer created [id:%s]', consumer.id);
});
const serverConsumer = yield axios_1.default
.post(`${apiUrl}/transports/${recvTransport.id}/consume`, {
producerId: producer.id,
apiToken,
})
.then((res) => res.data);
console.log('serverConsumer', serverConsumer);
const consumer = yield recvTransport.consume({
id: serverConsumer.id,
producerId: producer.id,
rtpParameters: serverConsumer.rtpParameters,
kind: 'audio',
});
consumer.on('transportclose', () => {
console.log('CONSUMER TRANS CLOSED');
});
consumer.on('trackended', () => {
console.log('TRACK ENDED');
});
resolve({ translatedTrack: consumer.track });
recvTransport.on('connectionstatechange', (state) => __awaiter(void 0, void 0, void 0, function* () {
console.log('client: recv transport connection state', state);
if (state === 'connected') {
console.log('client: connected');
}
}));
}));
});
exports.translateTrack = translateTrack;
//# sourceMappingURL=translate-track.js.map