@@ -22,8 +22,10 @@ module.exports = function (RED) {
2222 fs = require ( 'fs' ) ,
2323 WebSocket = require ( 'ws' ) ,
2424 fileType = require ( 'file-type' ) ,
25+ pkg = require ( '../../package.json' ) ,
2526 serviceutils = require ( '../../utilities/service-utils' ) ,
2627 payloadutils = require ( '../../utilities/payload-utils' ) ,
28+ iamutils = require ( '../../utilities/iam-utils' ) ,
2729 sttutils = require ( './stt-utils' ) ,
2830 AuthV1 = require ( 'watson-developer-cloud/authorization/v1' ) ,
2931 AuthIAMV1 = require ( 'watson-developer-cloud/iam-token-manager/v1' ) ,
@@ -268,7 +270,21 @@ module.exports = function (RED) {
268270 }
269271
270272 function getService ( ) {
271- return Promise . resolve ( determineService ( ) ) ;
273+ var p = new Promise ( function resolver ( resolve , reject ) {
274+ let sttService = determineService ( ) ;
275+ if ( apikey ) {
276+ sttService . preAuthenticate ( ( ready ) => {
277+ if ( ! ready ) {
278+ reject ( 'Service is not ready' ) ;
279+ } else {
280+ resolve ( sttService ) ;
281+ }
282+ } ) ;
283+ } else {
284+ resolve ( sttService ) ;
285+ }
286+ } ) ;
287+ return p ;
272288 }
273289
274290 function determineTokenService ( stt ) {
@@ -299,6 +315,95 @@ module.exports = function (RED) {
299315 return tokenService ;
300316 }
301317
318+ function cloneQS ( original ) {
319+ // First create an empty object that will receive copies of properties
320+ let clone = { } , i , keys = Object . keys ( original ) ;
321+
322+ for ( i = 0 ; i < keys . length ; i ++ ) {
323+ // copy each property into the clone
324+ clone [ keys [ i ] ] = original [ keys [ i ] ] ;
325+ }
326+ [ 'audio' , 'content_type' ] . forEach ( ( f ) => {
327+ if ( clone [ f ] ) {
328+ delete clone [ f ] ;
329+ }
330+ } ) ;
331+
332+ return clone ;
333+ }
334+
335+ function buildRequestSettings ( params , t ) {
336+ let requestSettings = {
337+ qs : cloneQS ( params ) ,
338+ method : 'POST' ,
339+ uri : endpoint + '/recognize' ,
340+ headers : {
341+ //Authorization: "Bearer " + t,
342+ 'Content-Type' : params . content_type ,
343+ 'User-Agent' : pkg . name + '-' + pkg . version ,
344+ 'Accept' : 'application/json' ,
345+ } ,
346+ iam_apikey : apikey ,
347+ auth : {
348+ 'bearer' : t
349+ } ,
350+ body : params . audio
351+ } ;
352+
353+ return Promise . resolve ( requestSettings ) ;
354+ }
355+
356+ function executePostRequest ( requestSettings ) {
357+ var p = new Promise ( function resolver ( resolve , reject ) {
358+ request ( requestSettings , ( error , response , body ) => {
359+ console . log ( '--------- request has been executed ---------------' ) ;
360+
361+ if ( ! error && response . statusCode == 200 ) {
362+ data = JSON . parse ( body ) ;
363+ resolve ( data ) ;
364+ } else if ( error ) {
365+ reject ( error ) ;
366+ } else {
367+ let errordata = JSON . parse ( body ) ;
368+ console . log ( errordata ) ;
369+ if ( errordata . errors &&
370+ Array . isArray ( errordata . errors ) &&
371+ errordata . errors . length &&
372+ errordata . errors [ 0 ] . message ) {
373+ reject ( 'Error ' + response . statusCode + ' ' + errordata . errors [ 0 ] . message ) ;
374+ } else {
375+ reject ( 'Error performing request ' + response . statusCode ) ;
376+ }
377+ }
378+
379+ } ) ;
380+ } ) ;
381+ return p ;
382+ }
383+
384+ function iamRecognize ( params ) {
385+ var p = new Promise ( function resolver ( resolve , reject ) {
386+ //console.log('qs params look like ', qs);
387+ // The token may have expired so test for it.
388+ //getToken(speech_to_text)
389+ iamutils . getIAMToken ( apikey )
390+ . then ( ( t ) => {
391+ //console.log('We should now have a token ', token);
392+ return buildRequestSettings ( params , t ) ;
393+ } )
394+ . then ( ( requestSettings ) => {
395+ //console.log('Request parameters look like ', requestSettings);
396+ return executePostRequest ( requestSettings ) ;
397+ } )
398+ . then ( ( data ) => {
399+ resolve ( data ) ;
400+ } )
401+ . catch ( ( err ) => {
402+ reject ( err ) ;
403+ } )
404+ } ) ;
405+ return p ;
406+ }
302407
303408 function performSTT ( speech_to_text , audioData ) {
304409 var p = new Promise ( function resolver ( resolve , reject ) {
@@ -640,9 +745,6 @@ module.exports = function (RED) {
640745 if ( config [ 'streaming-mode' ] ) {
641746 return performStreamSTT ( sttService , audioData ) ;
642747 } else {
643- if ( apikey ) {
644- node . warn ( 'STT Speech Recognition may not work with API Key!' ) ;
645- }
646748 return performSTT ( sttService , audioData ) ;
647749 }
648750 } )
0 commit comments