@liberfi.io/ui-media-track 0.1.276 → 0.1.277
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/client/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var centrifuge=require('@chainstream-io/centrifuge'),utils=require('@liberfi.io/utils'),types=require('@liberfi.io/types');function o(e){return {id:e.i,type:"tweet",tokenType:e.tt,token:e.t?
|
|
1
|
+
'use strict';var centrifuge=require('@chainstream-io/centrifuge'),utils=require('@liberfi.io/utils'),types=require('@liberfi.io/types');function o(e){return {id:e.i,type:"tweet",tokenType:e.tt,token:e.t?v(e.t):void 0,tweet:f(e.tw),sourceTweet:e.s?C(e.s):void 0}}function u(e){return e==="sol"?types.Chain.SOLANA:utils.chainIdBySlug(e)}function v(e){let t=u(e.c);return t?d(e,t):void 0}function G(e){let t=u(e.c);if(!t)throw new Error(`Unsupported chain: ${e.c}`);return d(e,t)}function d(e,t){let i=e.p&&e.p1&&new utils.SafeBigNumber(e.p1).isPositive()?new utils.SafeBigNumber(e.p).minus(e.p1).div(e.p1).times(100).toString():void 0;return {chain:t,address:e.a,symbol:e.s,image:e.i,latestPrice:e.p,previousPrice:e.p1,priceChange:i}}function f(e){return {tweetId:e.i,type:e.t,timestamp:Number(e.ts),user:b(e.u),content:p(e.c)}}function C(e){return {tweetId:e.i,user:b(e.u),content:p(e.c)}}function b(e){return {username:e.s,screenName:e.n,avatar:e.a,tags:e.ut}}function p(e){return {text:e.t,medias:e.m?e.m.map(y).filter(Boolean):void 0}}function y(e){return {type:e.t,url:e.u}}function T(e){return {symbol:e.ticker,name:e.coin_name,image:e.icon_url}}function w(e,t,i){if(e.type==="tweet")return I(e,t,i);throw new Error(`Unsupported media type: ${e.type}`)}function l(e){if(e.type==="tweet")return x(e);throw new Error(`Unsupported media type: ${e.type}`)}function x(e){return {tweet_id:e.tweet.tweetId,tweet_info:e.tweet.content.text}}function I(e,t,i){return {res_type:"tw",res_id:i?.sourceTweet?e.sourceTweet?.tweetId??e.id:e.id,source_lang:i?.sourceLanguage,target_lang:t,text:(i?.sourceTweet?e.sourceTweet?.content.text:e.tweet.content.text)??""}}var M=class e{client;listenersMap;endpoint;streamEndpoint;accessToken;initPromise=null;static get isServer(){return typeof window>"u"}constructor({endpoint:t,streamEndpoint:i,accessToken:n}){this.endpoint=t,this.streamEndpoint=i,this.accessToken=n,this.listenersMap=new Map,e.isServer||this.connect();}async initClient(){if(this.client)return;let t=await this.getTokenValue(),i=this.buildWsUrl(this.streamEndpoint,t);this.client=new centrifuge.Centrifuge(i,{getToken:async()=>this.getTokenValue()}),this.client.on("connected",()=>{console.info("[media-track] connected");}).on("disconnected",n=>{console.warn("[media-track] disconnected",n);}).on("error",n=>{console.error("[media-track] error: ",n);});}async getTokenValue(){return typeof this.accessToken=="string"?this.accessToken:await this.accessToken.getToken()}buildWsUrl(t,i){let n=new URL(t);return n.searchParams.set("token",i),n.toString()}async ensureInitialized(){e.isServer||(this.initPromise||this.connect(),await this.initPromise);}async translate(t,i,n){let r=await this._requestOptions(),s=w(t,i,n);return (await utils.httpPost(`${this.endpoint}/translation`,s,r)).data.target_text}connect(){e.isServer||(this.initPromise=this.initClient().then(()=>{this.client.connect();}));}disconnect(){this.client&&this.client.disconnect(),this.initPromise=null;}subscribe(t,i){let n=this.listenersMap.get(t);return n||(n=new Set,this.listenersMap.set(t,n)),n.add(i),this.ensureInitialized().then(()=>{this.client.getSubscription(t)||(console.info("[media-track] create new sub: ",t),this.client.newSubscription(t,{delta:"fossil"}).on("subscribed",()=>{console.info("[media-track] subscribed",t);}).on("unsubscribed",()=>{console.info("[media-track] unsubscribed",t);}).on("publication",s=>{this.listenersMap.get(t)?.forEach(S=>S(s.data));}).subscribe());}),new a(this,t,i)}unsubscribe(t,i){let n=this.listenersMap.get(t);if(n&&(n.delete(i),console.info(`[media-track] unsubscribe ${t} listener, remain: ${n.size}`),n.size===0)){console.info(`[media-track] unsubscribe channel: ${t}`);let r=this.client.getSubscription(t);r&&(r.unsubscribe(),this.client.removeSubscription(r)),this.listenersMap.delete(t);}}subscribeTweetMedia({callback:t}){return this.subscribe("x-monitor-basic",i=>{try{t(o(i));}catch(n){console.error("[media-track] subscribeTweetMedia error: ",n);}})}subscribeTweetMediaToken({callback:t}){return this.subscribe("x-monitor-token",i=>{try{t(o(i));}catch(n){console.error("[media-track] subscribeTweetMediaToken error: ",n);}})}async generateMeme(t){let i=await this._requestOptions(),n=l(t),r=await utils.httpPost(`${this.endpoint}/meme/generate`,n,i);return T(r.data)}async _requestOptions(){return {headers:{Authorization:`Bearer ${await this.getTokenValue()}`}}}},a=class{constructor(t,i,n){this.client=t;this.channel=i;this.fn=n;}unsubscribe(){this.client.unsubscribe(this.channel,this.fn);}};exports.MediaTrackClient=M;exports.convertFromGenerateMemeResult=T;exports.convertFromSubscribedMediaToken=G;exports.convertFromSubscribedSourceTweet=C;exports.convertFromSubscribedTweet=f;exports.convertFromSubscribedTweetContent=p;exports.convertFromSubscribedTweetContentMedia=y;exports.convertFromSubscribedTweetMedia=o;exports.convertFromSubscribedTweetUser=b;exports.toGenerateMemeParamsDTO=l;exports.toGenerateTweetMemeParamsDTO=x;exports.toTranslateParamsDTO=w;exports.toTranslateTweetParamsDTO=I;//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/utils.ts","../../src/client/client.ts"],"names":["convertFromSubscribedTweetMedia","from","convertFromSubscribedMediaToken","convertFromSubscribedTweet","convertFromSubscribedSourceTweet","chain","Chain","chainIdBySlug","priceChange","SafeBigNumber","convertFromSubscribedTweetUser","convertFromSubscribedTweetContent","convertFromSubscribedTweetContentMedia","convertFromGenerateMemeResult","toTranslateParamsDTO","media","targetLanguage","options","toTranslateTweetParamsDTO","toGenerateMemeParamsDTO","toGenerateTweetMemeParamsDTO","MediaTrackClient","_MediaTrackClient","endpoint","streamEndpoint","accessToken","token","wsUrl","Centrifuge","err","url","requestOptions","params","httpPost","channel","fn","listeners","ctx","it","Subscription","sub","callback","data","error","res","client"],"mappings":"wIA0BO,SAASA,EACdC,CAAAA,CACY,CACZ,OAAO,CACL,EAAA,CAAIA,CAAAA,CAAK,EACT,IAAA,CAAM,OAAA,CACN,SAAA,CAAWA,CAAAA,CAAK,EAAA,CAChB,KAAA,CAAOA,EAAK,CAAA,CAAIC,CAAAA,CAAgCD,CAAAA,CAAK,CAAC,CAAA,CAAI,MAAA,CAC1D,MAAOE,CAAAA,CAA2BF,CAAAA,CAAK,EAAE,CAAA,CACzC,WAAA,CAAaA,CAAAA,CAAK,EAAIG,CAAAA,CAAiCH,CAAAA,CAAK,CAAC,CAAA,CAAI,MACnE,CACF,CAEO,SAASC,CAAAA,CACdD,CAAAA,CACY,CACZ,IAAMI,CAAAA,CAAQJ,EAAK,CAAA,GAAM,KAAA,CAAQK,WAAAA,CAAM,MAAA,CAASC,mBAAAA,CAAcN,CAAAA,CAAK,CAAC,CAAA,CACpE,GAAI,CAACI,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsBJ,CAAAA,CAAK,CAAC,CAAA,CAAE,CAAA,CAEhD,IAAMO,EACJP,CAAAA,CAAK,CAAA,EAAKA,CAAAA,CAAK,EAAA,EAAM,IAAIQ,mBAAAA,CAAcR,EAAK,EAAE,CAAA,CAAE,UAAA,EAAW,CACvD,IAAIQ,mBAAAA,CAAcR,EAAK,CAAC,CAAA,CACrB,KAAA,CAAMA,CAAAA,CAAK,EAAE,CAAA,CACb,IAAIA,CAAAA,CAAK,EAAE,CAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,UAAS,CACZ,MAAA,CACN,OAAO,CACL,KAAA,CAAAI,EACA,OAAA,CAASJ,CAAAA,CAAK,CAAA,CACd,MAAA,CAAQA,CAAAA,CAAK,CAAA,CACb,MAAOA,CAAAA,CAAK,CAAA,CACZ,WAAA,CAAaA,CAAAA,CAAK,CAAA,CAClB,aAAA,CAAeA,EAAK,EAAA,CACpB,WAAA,CAAAO,CACF,CACF,CAEO,SAASL,EAA2BF,CAAAA,CAA8B,CACvE,OAAO,CACL,OAAA,CAASA,CAAAA,CAAK,EACd,IAAA,CAAMA,CAAAA,CAAK,CAAA,CACX,SAAA,CAAW,MAAA,CAAOA,CAAAA,CAAK,EAAE,CAAA,CACzB,IAAA,CAAMS,CAAAA,CAA+BT,CAAAA,CAAK,CAAC,CAAA,CAC3C,QAASU,CAAAA,CAAkCV,CAAAA,CAAK,CAAC,CACnD,CACF,CAEO,SAASG,CAAAA,CACdH,CAAAA,CACa,CACb,OAAO,CACL,OAAA,CAASA,EAAK,CAAA,CACd,IAAA,CAAMS,CAAAA,CAA+BT,CAAAA,CAAK,CAAC,CAAA,CAC3C,QAASU,CAAAA,CAAkCV,CAAAA,CAAK,CAAC,CACnD,CACF,CAEO,SAASS,CAAAA,CACdT,CAAAA,CACW,CACX,OAAO,CACL,QAAA,CAAUA,EAAK,CAAA,CACf,UAAA,CAAYA,CAAAA,CAAK,CAAA,CACjB,MAAA,CAAQA,CAAAA,CAAK,EACb,IAAA,CAAMA,CAAAA,CAAK,EACb,CACF,CAEO,SAASU,EACdV,CAAAA,CACc,CACd,OAAO,CACL,IAAA,CAAMA,CAAAA,CAAK,EACX,MAAA,CAAQA,CAAAA,CAAK,CAAA,CACTA,CAAAA,CAAK,CAAA,CAAE,GAAA,CAAIW,CAAsC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CACjE,MACN,CACF,CAEO,SAASA,CAAAA,CACdX,CAAAA,CACmB,CACnB,OAAO,CACL,IAAA,CAAMA,CAAAA,CAAK,CAAA,CACX,GAAA,CAAKA,CAAAA,CAAK,CACZ,CACF,CAEO,SAASY,CAAAA,CACdZ,CAAAA,CACmB,CACnB,OAAO,CACL,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,IAAA,CAAMA,CAAAA,CAAK,SAAA,CACX,MAAOA,CAAAA,CAAK,QACd,CACF,CAEO,SAASa,CAAAA,CACdC,EACAC,CAAAA,CACAC,CAAAA,CACuB,CACvB,GAAQF,CAAAA,CAAM,IAAA,GACP,QACH,OAAOG,CAAAA,CACLH,CAAAA,CACAC,CAAAA,CACAC,CACF,CAAA,CAEA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BF,CAAAA,CAAM,IAAI,CAAA,CAAE,CAE7D,CAEO,SAASI,CAAAA,CAAwBJ,CAAAA,CAAe,CACrD,GAAQA,EAAM,IAAA,GACP,OAAA,CACH,OAAOK,CAAAA,CAA6BL,CAAmB,CAAA,CAEvD,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,CAAAA,CAAM,IAAI,CAAA,CAAE,CAE7D,CAEO,SAASK,CAAAA,CAA6BL,CAAAA,CAAmB,CAC9D,OAAO,CACL,QAAA,CAAUA,CAAAA,CAAM,KAAA,CAAM,OAAA,CACtB,UAAA,CAAYA,CAAAA,CAAM,MAAM,OAAA,CAAQ,IAClC,CACF,CAEO,SAASG,CAAAA,CACdH,EACAC,CAAAA,CACAC,CAAAA,CACuB,CACvB,OAAO,CACL,QAAA,CAAU,KACV,MAAA,CAAQA,CAAAA,EAAS,WAAA,CACZF,CAAAA,CAAM,WAAA,EAAa,OAAA,EAAWA,EAAM,EAAA,CACrCA,CAAAA,CAAM,EAAA,CACV,WAAA,CAAaE,CAAAA,EAAS,cAAA,CACtB,YAAaD,CAAAA,CACb,IAAA,CAAA,CACGC,CAAAA,EAAS,WAAA,CACNF,CAAAA,CAAM,WAAA,EAAa,QAAQ,IAAA,CAC3BA,CAAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,GAAS,EACrC,CACF,CC9IO,IAAMM,CAAAA,CAAN,MAAMC,CAA8C,CACjD,OACA,YAAA,CACA,QAAA,CACA,cAAA,CACA,WAAA,CACA,WAAA,CAAoC,IAAA,CAE5C,WAAmB,QAAA,EAAoB,CACrC,OAAO,OAAO,MAAA,CAAW,GAC3B,CAEA,WAAA,CAAY,CACV,QAAA,CAAAC,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,YAAAC,CACF,CAAA,CAA4B,CAC1B,IAAA,CAAK,QAAA,CAAWF,CAAAA,CAChB,KAAK,cAAA,CAAiBC,CAAAA,CACtB,IAAA,CAAK,WAAA,CAAcC,CAAAA,CACnB,IAAA,CAAK,aAAe,IAAI,GAAA,CAEnBH,CAAAA,CAAiB,QAAA,EACpB,IAAA,CAAK,OAAA,GAET,CAEA,MAAc,UAAA,EAAa,CACzB,GAAI,IAAA,CAAK,OACP,OAEF,IAAMI,CAAAA,CAAQ,MAAM,IAAA,CAAK,aAAA,GACnBC,CAAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,cAAA,CAAgBD,CAAK,EACxD,IAAA,CAAK,MAAA,CAAS,IAAIE,qBAAAA,CAAWD,CAAAA,CAAO,CAClC,SAAU,SACD,IAAA,CAAK,aAAA,EAEhB,CAAC,CAAA,CAED,KAAK,MAAA,CACF,EAAA,CAAG,YAAa,IAAM,CACrB,QAAQ,IAAA,CAAK,yBAAyB,EACxC,CAAC,CAAA,CACA,EAAA,CAAG,eAAiBE,CAAAA,EAAQ,CAC3B,OAAA,CAAQ,IAAA,CAAK,4BAAA,CAA8BA,CAAG,EAChD,CAAC,CAAA,CACA,EAAA,CAAG,OAAA,CAAUA,CAAAA,EAAQ,CACpB,QAAQ,KAAA,CAAM,uBAAA,CAAyBA,CAAG,EAC5C,CAAC,EACL,CAEA,MAAc,aAAA,EAAiC,CAC7C,OAAO,OAAO,IAAA,CAAK,aAAgB,QAAA,CAC/B,IAAA,CAAK,WAAA,CACL,MAAM,IAAA,CAAK,WAAA,CAAY,UAC7B,CAEQ,UAAA,CAAWN,CAAAA,CAAkBG,CAAAA,CAAuB,CAC1D,IAAMI,CAAAA,CAAM,IAAI,GAAA,CAAIP,CAAQ,CAAA,CAC5B,OAAAO,EAAI,YAAA,CAAa,GAAA,CAAI,OAAA,CAASJ,CAAK,CAAA,CAC5BI,CAAAA,CAAI,UACb,CAEA,MAAc,iBAAA,EAAoB,CAC5BR,CAAAA,CAAiB,WAChB,IAAA,CAAK,WAAA,EACR,IAAA,CAAK,OAAA,EAAQ,CAEf,MAAM,KAAK,WAAA,EACb,CAEA,MAAM,SAAA,CACJP,CAAAA,CACAC,CAAAA,CACAC,EACiB,CACjB,IAAMc,CAAAA,CAAiB,MAAM,IAAA,CAAK,eAAA,GAC5BC,CAAAA,CAASlB,CAAAA,CAAqBC,CAAAA,CAAOC,CAAAA,CAAgBC,CAAO,CAAA,CAMlE,QALY,MAAMgB,cAAAA,CAChB,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,YAAA,CAAA,CAChBD,EACAD,CACF,CAAA,EACW,IAAA,CAAK,WAClB,CAOA,OAAA,EAAU,CACJT,CAAAA,CAAiB,QAAA,GACrB,IAAA,CAAK,WAAA,CAAc,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,IAAM,CAC9C,IAAA,CAAK,MAAA,CAAO,OAAA,GACd,CAAC,CAAA,EACH,CAKA,UAAA,EAAa,CACP,IAAA,CAAK,QACP,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW,CAEzB,IAAA,CAAK,WAAA,CAAc,KACrB,CAEA,SAAA,CAAmBY,CAAAA,CAAiBC,CAAAA,CAAsC,CACxE,IAAIC,EAAY,IAAA,CAAK,YAAA,CAAa,GAAA,CAAIF,CAAO,CAAA,CAC7C,OAAKE,IACHA,CAAAA,CAAY,IAAI,GAAA,CAChB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAIF,EAASE,CAAS,CAAA,CAAA,CAE1CA,CAAAA,CAAU,GAAA,CAAID,CAAE,CAAA,CAEX,KAAK,iBAAA,EAAkB,CAAE,IAAA,CAAK,IAAM,CAClC,IAAA,CAAK,OAAO,eAAA,CAAgBD,CAAO,CAAA,GACtC,OAAA,CAAQ,IAAA,CAAK,gCAAA,CAAkCA,CAAO,CAAA,CAE1C,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgBA,CAAAA,CAAS,CAC/C,MAAO,QACT,CAAC,CAAA,CAGE,EAAA,CAAG,YAAA,CAAc,IAAM,CACtB,OAAA,CAAQ,IAAA,CAAK,0BAAA,CAA4BA,CAAO,EAClD,CAAC,EACA,EAAA,CAAG,cAAA,CAAgB,IAAM,CACxB,OAAA,CAAQ,IAAA,CAAK,6BAA8BA,CAAO,EACpD,CAAC,CAAA,CACA,EAAA,CAAG,aAAA,CAAgBG,GAAQ,CACf,IAAA,CAAK,aAAa,GAAA,CAAIH,CAAO,GACpC,OAAA,CAASI,CAAAA,EAAOA,CAAAA,CAAGD,CAAAA,CAAI,IAAI,CAAC,EAClC,CAAC,CAAA,CACA,SAAA,EAAU,EAEjB,CAAC,CAAA,CAEM,IAAIE,CAAAA,CAAgB,IAAA,CAAML,CAAAA,CAASC,CAAE,CAC9C,CAEA,YAAqBD,CAAAA,CAAiBC,CAAAA,CAAuB,CAC3D,IAAMC,CAAAA,CAAY,IAAA,CAAK,aAAa,GAAA,CAAIF,CAAO,CAAA,CAC/C,GAAKE,CAAAA,GAELA,CAAAA,CAAU,OAAOD,CAAE,CAAA,CACnB,OAAA,CAAQ,IAAA,CACN,CAAA,0BAAA,EAA6BD,CAAO,sBAAsBE,CAAAA,CAAU,IAAI,CAAA,CAC1E,CAAA,CAEIA,CAAAA,CAAU,IAAA,GAAS,GAAG,CACxB,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsCF,CAAO,CAAA,CAAE,EAE5D,IAAMM,CAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgBN,CAAO,EAC3CM,CAAAA,GACFA,CAAAA,CAAI,WAAA,EAAY,CAChB,IAAA,CAAK,MAAA,CAAO,mBAAmBA,CAAG,CAAA,CAAA,CAGpC,IAAA,CAAK,YAAA,CAAa,MAAA,CAAON,CAAO,EAClC,CACF,CAEA,mBAAA,CAAoB,CAClB,QAAA,CAAAO,CACF,EAA+C,CAC7C,OAAO,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAoBC,CAAAA,EAA+B,CACvE,GAAI,CACFD,CAAAA,CAASzC,CAAAA,CAAgC0C,CAAI,CAAC,EAChD,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,2CAAA,CAA6CA,CAAK,EAClE,CACF,CAAC,CACH,CAEA,wBAAA,CAAyB,CACvB,QAAA,CAAAF,CACF,CAAA,CAA+C,CAC7C,OAAO,IAAA,CAAK,UAAU,iBAAA,CAAoBC,CAAAA,EAA+B,CACvE,GAAI,CACFD,CAAAA,CAASzC,EAAgC0C,CAAI,CAAC,EAChD,CAAA,MAASC,CAAAA,CAAO,CACd,QAAQ,KAAA,CAAM,gDAAA,CAAkDA,CAAK,EACvE,CACF,CAAC,CACH,CAEA,MAAM,YAAA,CAAa5B,CAAAA,CAA2C,CAC5D,IAAMgB,EAAiB,MAAM,IAAA,CAAK,eAAA,EAAgB,CAC5CC,CAAAA,CAASb,CAAAA,CAAwBJ,CAAK,CAAA,CACtC6B,CAAAA,CAAM,MAAMX,cAAAA,CAChB,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,cAAA,CAAA,CAChBD,CAAAA,CACAD,CACF,CAAA,CACA,OAAOlB,CAAAA,CAA8B+B,EAAI,IAAI,CAC/C,CAEA,MAAM,eAAA,EAAwD,CAE5D,OAAO,CACL,OAAA,CAAS,CACP,aAAA,CAAe,CAAA,OAAA,EAHL,MAAM,KAAK,aAAA,EAGS,CAAA,CAChC,CACF,CACF,CACF,EAEML,CAAAA,CAAN,KAAsB,CACpB,WAAA,CACmBM,CAAAA,CACAX,CAAAA,CACAC,EACjB,CAHiB,IAAA,CAAA,MAAA,CAAAU,CAAAA,CACA,IAAA,CAAA,OAAA,CAAAX,CAAAA,CACA,IAAA,CAAA,EAAA,CAAAC,EAChB,CAEH,WAAA,EAAc,CACZ,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,KAAK,OAAA,CAAS,IAAA,CAAK,EAAE,EAC/C,CACF","file":"index.js","sourcesContent":["import { LocaleCode } from \"@liberfi.io/i18n\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainIdBySlug, SafeBigNumber } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n MediaToken,\n SourceTweet,\n Tweet,\n TweetContent,\n TweetContentMedia,\n TweetMedia,\n TweetUser,\n} from \"../types\";\nimport {\n GenerateMemeResult,\n SubscribedMediaToken,\n SubscribedSourceTweet,\n SubscribedTweet,\n SubscribedTweetContent,\n SubscribedTweetContentMedia,\n SubscribedTweetMedia,\n SubscribedTweetUser,\n TranslateTweetRequest,\n} from \"./types\";\n\nexport function convertFromSubscribedTweetMedia(\n from: SubscribedTweetMedia,\n): TweetMedia {\n return {\n id: from.i,\n type: \"tweet\",\n tokenType: from.tt,\n token: from.t ? convertFromSubscribedMediaToken(from.t) : undefined,\n tweet: convertFromSubscribedTweet(from.tw),\n sourceTweet: from.s ? convertFromSubscribedSourceTweet(from.s) : undefined,\n };\n}\n\nexport function convertFromSubscribedMediaToken(\n from: SubscribedMediaToken,\n): MediaToken {\n const chain = from.c === \"sol\" ? Chain.SOLANA : chainIdBySlug(from.c);\n if (!chain) {\n throw new Error(`Unsupported chain: ${from.c}`);\n }\n const priceChange =\n from.p && from.p1 && new SafeBigNumber(from.p1).isPositive()\n ? new SafeBigNumber(from.p)\n .minus(from.p1)\n .div(from.p1)\n .times(100)\n .toString()\n : undefined;\n return {\n chain,\n address: from.a,\n symbol: from.s,\n image: from.i,\n latestPrice: from.p,\n previousPrice: from.p1,\n priceChange,\n };\n}\n\nexport function convertFromSubscribedTweet(from: SubscribedTweet): Tweet {\n return {\n tweetId: from.i,\n type: from.t,\n timestamp: Number(from.ts),\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedSourceTweet(\n from: SubscribedSourceTweet,\n): SourceTweet {\n return {\n tweetId: from.i,\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedTweetUser(\n from: SubscribedTweetUser,\n): TweetUser {\n return {\n username: from.s,\n screenName: from.n,\n avatar: from.a,\n tags: from.ut,\n };\n}\n\nexport function convertFromSubscribedTweetContent(\n from: SubscribedTweetContent,\n): TweetContent {\n return {\n text: from.t,\n medias: from.m\n ? from.m.map(convertFromSubscribedTweetContentMedia).filter(Boolean)\n : undefined,\n };\n}\n\nexport function convertFromSubscribedTweetContentMedia(\n from: SubscribedTweetContentMedia,\n): TweetContentMedia {\n return {\n type: from.t,\n url: from.u,\n };\n}\n\nexport function convertFromGenerateMemeResult(\n from: GenerateMemeResult,\n): GeneratedMemeInfo {\n return {\n symbol: from.ticker,\n name: from.coin_name,\n image: from.icon_url,\n };\n}\n\nexport function toTranslateParamsDTO(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n switch (media.type) {\n case \"tweet\":\n return toTranslateTweetParamsDTO(\n media as TweetMedia,\n targetLanguage,\n options,\n );\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateMemeParamsDTO(media: IMedia) {\n switch (media.type) {\n case \"tweet\":\n return toGenerateTweetMemeParamsDTO(media as TweetMedia);\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateTweetMemeParamsDTO(media: TweetMedia) {\n return {\n tweet_id: media.tweet.tweetId,\n tweet_info: media.tweet.content.text,\n };\n}\n\nexport function toTranslateTweetParamsDTO(\n media: TweetMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n return {\n res_type: \"tw\",\n res_id: options?.sourceTweet\n ? (media.sourceTweet?.tweetId ?? media.id)\n : media.id,\n source_lang: options?.sourceLanguage,\n target_lang: targetLanguage,\n text:\n (options?.sourceTweet\n ? media.sourceTweet?.content.text\n : media.tweet.content.text) ?? \"\",\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\nimport { Centrifuge } from \"@chainstream-io/centrifuge\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { ISubscription } from \"@liberfi.io/types\";\nimport { httpPost } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n IMediaTrackClient,\n SubscribeTweetMediasOptions,\n} from \"../types\";\nimport {\n GenerateMemeResponse,\n SubscribedTweetMedia,\n TranslateTweetResponse,\n} from \"./types\";\nimport {\n convertFromGenerateMemeResult,\n convertFromSubscribedTweetMedia,\n toGenerateMemeParamsDTO,\n toTranslateParamsDTO,\n} from \"./utils\";\n\nexport interface MediaTrackClientOptions {\n endpoint: string;\n streamEndpoint: string;\n accessToken:\n | string\n | {\n getToken(): Promise<string> | string;\n };\n}\n\nexport class MediaTrackClient implements IMediaTrackClient {\n private client!: Centrifuge;\n private listenersMap: Map<string, Set<(data: any) => void>>;\n private endpoint: string;\n private streamEndpoint: string;\n private accessToken: MediaTrackClientOptions[\"accessToken\"];\n private initPromise: Promise<void> | null = null;\n\n private static get isServer(): boolean {\n return typeof window === \"undefined\";\n }\n\n constructor({\n endpoint,\n streamEndpoint,\n accessToken,\n }: MediaTrackClientOptions) {\n this.endpoint = endpoint;\n this.streamEndpoint = streamEndpoint;\n this.accessToken = accessToken;\n this.listenersMap = new Map();\n\n if (!MediaTrackClient.isServer) {\n this.connect();\n }\n }\n\n private async initClient() {\n if (this.client) {\n return;\n }\n const token = await this.getTokenValue();\n const wsUrl = this.buildWsUrl(this.streamEndpoint, token);\n this.client = new Centrifuge(wsUrl, {\n getToken: async () => {\n return this.getTokenValue();\n },\n });\n\n this.client\n .on(\"connected\", () => {\n console.info(\"[media-track] connected\");\n })\n .on(\"disconnected\", (err) => {\n console.warn(\"[media-track] disconnected\", err);\n })\n .on(\"error\", (err) => {\n console.error(\"[media-track] error: \", err);\n });\n }\n\n private async getTokenValue(): Promise<string> {\n return typeof this.accessToken === \"string\"\n ? this.accessToken\n : await this.accessToken.getToken();\n }\n\n private buildWsUrl(endpoint: string, token: string): string {\n const url = new URL(endpoint);\n url.searchParams.set(\"token\", token);\n return url.toString();\n }\n\n private async ensureInitialized() {\n if (MediaTrackClient.isServer) return;\n if (!this.initPromise) {\n this.connect();\n }\n await this.initPromise;\n }\n\n async translate(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n ): Promise<string> {\n const requestOptions = await this._requestOptions();\n const params = toTranslateParamsDTO(media, targetLanguage, options);\n const res = await httpPost<TranslateTweetResponse>(\n `${this.endpoint}/translation`,\n params,\n requestOptions,\n );\n return res.data.target_text;\n }\n\n /**\n * Connect to the media track realtime server.\n * Lazily initializes the Centrifuge client on first call.\n * No-op when called during SSR (Node.js).\n */\n connect() {\n if (MediaTrackClient.isServer) return;\n this.initPromise = this.initClient().then(() => {\n this.client.connect();\n });\n }\n\n /**\n * Disconnect and release the underlying Centrifuge transport.\n */\n disconnect() {\n if (this.client) {\n this.client.disconnect();\n }\n this.initPromise = null;\n }\n\n subscribe<T = any>(channel: string, fn: (data: T) => void): ISubscription {\n let listeners = this.listenersMap.get(channel);\n if (!listeners) {\n listeners = new Set();\n this.listenersMap.set(channel, listeners);\n }\n listeners.add(fn);\n\n void this.ensureInitialized().then(() => {\n if (!this.client.getSubscription(channel)) {\n console.info(\"[media-track] create new sub: \", channel);\n\n const sub = this.client.newSubscription(channel, {\n delta: \"fossil\",\n });\n\n sub\n .on(\"subscribed\", () => {\n console.info(\"[media-track] subscribed\", channel);\n })\n .on(\"unsubscribed\", () => {\n console.info(\"[media-track] unsubscribed\", channel);\n })\n .on(\"publication\", (ctx) => {\n const ls = this.listenersMap.get(channel);\n ls?.forEach((it) => it(ctx.data));\n })\n .subscribe();\n }\n });\n\n return new Subscription<T>(this, channel, fn);\n }\n\n unsubscribe<T = any>(channel: string, fn: (data: T) => void) {\n const listeners = this.listenersMap.get(channel);\n if (!listeners) return;\n\n listeners.delete(fn);\n console.info(\n `[media-track] unsubscribe ${channel} listener, remain: ${listeners.size}`,\n );\n\n if (listeners.size === 0) {\n console.info(`[media-track] unsubscribe channel: ${channel}`);\n\n const sub = this.client.getSubscription(channel);\n if (sub) {\n sub.unsubscribe();\n this.client.removeSubscription(sub);\n }\n\n this.listenersMap.delete(channel);\n }\n }\n\n subscribeTweetMedia({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-basic\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMedia error: \", error);\n }\n });\n }\n\n subscribeTweetMediaToken({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-token\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMediaToken error: \", error);\n }\n });\n }\n\n async generateMeme(media: IMedia): Promise<GeneratedMemeInfo> {\n const requestOptions = await this._requestOptions();\n const params = toGenerateMemeParamsDTO(media);\n const res = await httpPost<GenerateMemeResponse>(\n `${this.endpoint}/meme/generate`,\n params,\n requestOptions,\n );\n return convertFromGenerateMemeResult(res.data);\n }\n\n async _requestOptions(): Promise<Omit<RequestInit, \"method\">> {\n const token = await this.getTokenValue();\n return {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n };\n }\n}\n\nclass Subscription<T> {\n constructor(\n private readonly client: MediaTrackClient,\n private readonly channel: string,\n private readonly fn: (data: T) => void,\n ) {}\n\n unsubscribe() {\n this.client.unsubscribe(this.channel, this.fn);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/utils.ts","../../src/client/client.ts"],"names":["convertFromSubscribedTweetMedia","from","tryConvertFromSubscribedMediaToken","convertFromSubscribedTweet","convertFromSubscribedSourceTweet","resolveSubscribedMediaTokenChain","slug","Chain","chainIdBySlug","chain","createMediaToken","convertFromSubscribedMediaToken","priceChange","SafeBigNumber","convertFromSubscribedTweetUser","convertFromSubscribedTweetContent","convertFromSubscribedTweetContentMedia","convertFromGenerateMemeResult","toTranslateParamsDTO","media","targetLanguage","options","toTranslateTweetParamsDTO","toGenerateMemeParamsDTO","toGenerateTweetMemeParamsDTO","MediaTrackClient","_MediaTrackClient","endpoint","streamEndpoint","accessToken","token","wsUrl","Centrifuge","err","url","requestOptions","params","httpPost","channel","fn","listeners","ctx","it","Subscription","sub","callback","data","error","res","client"],"mappings":"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","file":"index.js","sourcesContent":["import { LocaleCode } from \"@liberfi.io/i18n\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainIdBySlug, SafeBigNumber } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n MediaToken,\n SourceTweet,\n Tweet,\n TweetContent,\n TweetContentMedia,\n TweetMedia,\n TweetUser,\n} from \"../types\";\nimport {\n GenerateMemeResult,\n SubscribedMediaToken,\n SubscribedSourceTweet,\n SubscribedTweet,\n SubscribedTweetContent,\n SubscribedTweetContentMedia,\n SubscribedTweetMedia,\n SubscribedTweetUser,\n TranslateTweetRequest,\n} from \"./types\";\n\nexport function convertFromSubscribedTweetMedia(\n from: SubscribedTweetMedia,\n): TweetMedia {\n return {\n id: from.i,\n type: \"tweet\",\n tokenType: from.tt,\n // Token metadata is optional enrichment; an unknown chain must not drop the tweet.\n token: from.t ? tryConvertFromSubscribedMediaToken(from.t) : undefined,\n tweet: convertFromSubscribedTweet(from.tw),\n sourceTweet: from.s ? convertFromSubscribedSourceTweet(from.s) : undefined,\n };\n}\n\nfunction resolveSubscribedMediaTokenChain(slug: string): Chain | undefined {\n return slug === \"sol\" ? Chain.SOLANA : chainIdBySlug(slug);\n}\n\nfunction tryConvertFromSubscribedMediaToken(\n from: SubscribedMediaToken,\n): MediaToken | undefined {\n const chain = resolveSubscribedMediaTokenChain(from.c);\n return chain ? createMediaToken(from, chain) : undefined;\n}\n\nexport function convertFromSubscribedMediaToken(\n from: SubscribedMediaToken,\n): MediaToken {\n const chain = resolveSubscribedMediaTokenChain(from.c);\n if (!chain) {\n throw new Error(`Unsupported chain: ${from.c}`);\n }\n return createMediaToken(from, chain);\n}\n\nfunction createMediaToken(\n from: SubscribedMediaToken,\n chain: Chain,\n): MediaToken {\n const priceChange =\n from.p && from.p1 && new SafeBigNumber(from.p1).isPositive()\n ? new SafeBigNumber(from.p)\n .minus(from.p1)\n .div(from.p1)\n .times(100)\n .toString()\n : undefined;\n return {\n chain,\n address: from.a,\n symbol: from.s,\n image: from.i,\n latestPrice: from.p,\n previousPrice: from.p1,\n priceChange,\n };\n}\n\nexport function convertFromSubscribedTweet(from: SubscribedTweet): Tweet {\n return {\n tweetId: from.i,\n type: from.t,\n timestamp: Number(from.ts),\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedSourceTweet(\n from: SubscribedSourceTweet,\n): SourceTweet {\n return {\n tweetId: from.i,\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedTweetUser(\n from: SubscribedTweetUser,\n): TweetUser {\n return {\n username: from.s,\n screenName: from.n,\n avatar: from.a,\n tags: from.ut,\n };\n}\n\nexport function convertFromSubscribedTweetContent(\n from: SubscribedTweetContent,\n): TweetContent {\n return {\n text: from.t,\n medias: from.m\n ? from.m.map(convertFromSubscribedTweetContentMedia).filter(Boolean)\n : undefined,\n };\n}\n\nexport function convertFromSubscribedTweetContentMedia(\n from: SubscribedTweetContentMedia,\n): TweetContentMedia {\n return {\n type: from.t,\n url: from.u,\n };\n}\n\nexport function convertFromGenerateMemeResult(\n from: GenerateMemeResult,\n): GeneratedMemeInfo {\n return {\n symbol: from.ticker,\n name: from.coin_name,\n image: from.icon_url,\n };\n}\n\nexport function toTranslateParamsDTO(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n switch (media.type) {\n case \"tweet\":\n return toTranslateTweetParamsDTO(\n media as TweetMedia,\n targetLanguage,\n options,\n );\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateMemeParamsDTO(media: IMedia) {\n switch (media.type) {\n case \"tweet\":\n return toGenerateTweetMemeParamsDTO(media as TweetMedia);\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateTweetMemeParamsDTO(media: TweetMedia) {\n return {\n tweet_id: media.tweet.tweetId,\n tweet_info: media.tweet.content.text,\n };\n}\n\nexport function toTranslateTweetParamsDTO(\n media: TweetMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n return {\n res_type: \"tw\",\n res_id: options?.sourceTweet\n ? (media.sourceTweet?.tweetId ?? media.id)\n : media.id,\n source_lang: options?.sourceLanguage,\n target_lang: targetLanguage,\n text:\n (options?.sourceTweet\n ? media.sourceTweet?.content.text\n : media.tweet.content.text) ?? \"\",\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\nimport { Centrifuge } from \"@chainstream-io/centrifuge\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { ISubscription } from \"@liberfi.io/types\";\nimport { httpPost } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n IMediaTrackClient,\n SubscribeTweetMediasOptions,\n} from \"../types\";\nimport {\n GenerateMemeResponse,\n SubscribedTweetMedia,\n TranslateTweetResponse,\n} from \"./types\";\nimport {\n convertFromGenerateMemeResult,\n convertFromSubscribedTweetMedia,\n toGenerateMemeParamsDTO,\n toTranslateParamsDTO,\n} from \"./utils\";\n\nexport interface MediaTrackClientOptions {\n endpoint: string;\n streamEndpoint: string;\n accessToken:\n | string\n | {\n getToken(): Promise<string> | string;\n };\n}\n\nexport class MediaTrackClient implements IMediaTrackClient {\n private client!: Centrifuge;\n private listenersMap: Map<string, Set<(data: any) => void>>;\n private endpoint: string;\n private streamEndpoint: string;\n private accessToken: MediaTrackClientOptions[\"accessToken\"];\n private initPromise: Promise<void> | null = null;\n\n private static get isServer(): boolean {\n return typeof window === \"undefined\";\n }\n\n constructor({\n endpoint,\n streamEndpoint,\n accessToken,\n }: MediaTrackClientOptions) {\n this.endpoint = endpoint;\n this.streamEndpoint = streamEndpoint;\n this.accessToken = accessToken;\n this.listenersMap = new Map();\n\n if (!MediaTrackClient.isServer) {\n this.connect();\n }\n }\n\n private async initClient() {\n if (this.client) {\n return;\n }\n const token = await this.getTokenValue();\n const wsUrl = this.buildWsUrl(this.streamEndpoint, token);\n this.client = new Centrifuge(wsUrl, {\n getToken: async () => {\n return this.getTokenValue();\n },\n });\n\n this.client\n .on(\"connected\", () => {\n console.info(\"[media-track] connected\");\n })\n .on(\"disconnected\", (err) => {\n console.warn(\"[media-track] disconnected\", err);\n })\n .on(\"error\", (err) => {\n console.error(\"[media-track] error: \", err);\n });\n }\n\n private async getTokenValue(): Promise<string> {\n return typeof this.accessToken === \"string\"\n ? this.accessToken\n : await this.accessToken.getToken();\n }\n\n private buildWsUrl(endpoint: string, token: string): string {\n const url = new URL(endpoint);\n url.searchParams.set(\"token\", token);\n return url.toString();\n }\n\n private async ensureInitialized() {\n if (MediaTrackClient.isServer) return;\n if (!this.initPromise) {\n this.connect();\n }\n await this.initPromise;\n }\n\n async translate(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n ): Promise<string> {\n const requestOptions = await this._requestOptions();\n const params = toTranslateParamsDTO(media, targetLanguage, options);\n const res = await httpPost<TranslateTweetResponse>(\n `${this.endpoint}/translation`,\n params,\n requestOptions,\n );\n return res.data.target_text;\n }\n\n /**\n * Connect to the media track realtime server.\n * Lazily initializes the Centrifuge client on first call.\n * No-op when called during SSR (Node.js).\n */\n connect() {\n if (MediaTrackClient.isServer) return;\n this.initPromise = this.initClient().then(() => {\n this.client.connect();\n });\n }\n\n /**\n * Disconnect and release the underlying Centrifuge transport.\n */\n disconnect() {\n if (this.client) {\n this.client.disconnect();\n }\n this.initPromise = null;\n }\n\n subscribe<T = any>(channel: string, fn: (data: T) => void): ISubscription {\n let listeners = this.listenersMap.get(channel);\n if (!listeners) {\n listeners = new Set();\n this.listenersMap.set(channel, listeners);\n }\n listeners.add(fn);\n\n void this.ensureInitialized().then(() => {\n if (!this.client.getSubscription(channel)) {\n console.info(\"[media-track] create new sub: \", channel);\n\n const sub = this.client.newSubscription(channel, {\n delta: \"fossil\",\n });\n\n sub\n .on(\"subscribed\", () => {\n console.info(\"[media-track] subscribed\", channel);\n })\n .on(\"unsubscribed\", () => {\n console.info(\"[media-track] unsubscribed\", channel);\n })\n .on(\"publication\", (ctx) => {\n const ls = this.listenersMap.get(channel);\n ls?.forEach((it) => it(ctx.data));\n })\n .subscribe();\n }\n });\n\n return new Subscription<T>(this, channel, fn);\n }\n\n unsubscribe<T = any>(channel: string, fn: (data: T) => void) {\n const listeners = this.listenersMap.get(channel);\n if (!listeners) return;\n\n listeners.delete(fn);\n console.info(\n `[media-track] unsubscribe ${channel} listener, remain: ${listeners.size}`,\n );\n\n if (listeners.size === 0) {\n console.info(`[media-track] unsubscribe channel: ${channel}`);\n\n const sub = this.client.getSubscription(channel);\n if (sub) {\n sub.unsubscribe();\n this.client.removeSubscription(sub);\n }\n\n this.listenersMap.delete(channel);\n }\n }\n\n subscribeTweetMedia({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-basic\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMedia error: \", error);\n }\n });\n }\n\n subscribeTweetMediaToken({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-token\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMediaToken error: \", error);\n }\n });\n }\n\n async generateMeme(media: IMedia): Promise<GeneratedMemeInfo> {\n const requestOptions = await this._requestOptions();\n const params = toGenerateMemeParamsDTO(media);\n const res = await httpPost<GenerateMemeResponse>(\n `${this.endpoint}/meme/generate`,\n params,\n requestOptions,\n );\n return convertFromGenerateMemeResult(res.data);\n }\n\n async _requestOptions(): Promise<Omit<RequestInit, \"method\">> {\n const token = await this.getTokenValue();\n return {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n };\n }\n}\n\nclass Subscription<T> {\n constructor(\n private readonly client: MediaTrackClient,\n private readonly channel: string,\n private readonly fn: (data: T) => void,\n ) {}\n\n unsubscribe() {\n this.client.unsubscribe(this.channel, this.fn);\n }\n}\n"]}
|
package/dist/client/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {Centrifuge}from'@chainstream-io/centrifuge';import {
|
|
1
|
+
import {Centrifuge}from'@chainstream-io/centrifuge';import {SafeBigNumber,httpPost,chainIdBySlug}from'@liberfi.io/utils';import {Chain}from'@liberfi.io/types';function o(e){return {id:e.i,type:"tweet",tokenType:e.tt,token:e.t?v(e.t):void 0,tweet:f(e.tw),sourceTweet:e.s?C(e.s):void 0}}function u(e){return e==="sol"?Chain.SOLANA:chainIdBySlug(e)}function v(e){let t=u(e.c);return t?d(e,t):void 0}function G(e){let t=u(e.c);if(!t)throw new Error(`Unsupported chain: ${e.c}`);return d(e,t)}function d(e,t){let i=e.p&&e.p1&&new SafeBigNumber(e.p1).isPositive()?new SafeBigNumber(e.p).minus(e.p1).div(e.p1).times(100).toString():void 0;return {chain:t,address:e.a,symbol:e.s,image:e.i,latestPrice:e.p,previousPrice:e.p1,priceChange:i}}function f(e){return {tweetId:e.i,type:e.t,timestamp:Number(e.ts),user:b(e.u),content:p(e.c)}}function C(e){return {tweetId:e.i,user:b(e.u),content:p(e.c)}}function b(e){return {username:e.s,screenName:e.n,avatar:e.a,tags:e.ut}}function p(e){return {text:e.t,medias:e.m?e.m.map(y).filter(Boolean):void 0}}function y(e){return {type:e.t,url:e.u}}function T(e){return {symbol:e.ticker,name:e.coin_name,image:e.icon_url}}function w(e,t,i){if(e.type==="tweet")return I(e,t,i);throw new Error(`Unsupported media type: ${e.type}`)}function l(e){if(e.type==="tweet")return x(e);throw new Error(`Unsupported media type: ${e.type}`)}function x(e){return {tweet_id:e.tweet.tweetId,tweet_info:e.tweet.content.text}}function I(e,t,i){return {res_type:"tw",res_id:i?.sourceTweet?e.sourceTweet?.tweetId??e.id:e.id,source_lang:i?.sourceLanguage,target_lang:t,text:(i?.sourceTweet?e.sourceTweet?.content.text:e.tweet.content.text)??""}}var M=class e{client;listenersMap;endpoint;streamEndpoint;accessToken;initPromise=null;static get isServer(){return typeof window>"u"}constructor({endpoint:t,streamEndpoint:i,accessToken:n}){this.endpoint=t,this.streamEndpoint=i,this.accessToken=n,this.listenersMap=new Map,e.isServer||this.connect();}async initClient(){if(this.client)return;let t=await this.getTokenValue(),i=this.buildWsUrl(this.streamEndpoint,t);this.client=new Centrifuge(i,{getToken:async()=>this.getTokenValue()}),this.client.on("connected",()=>{console.info("[media-track] connected");}).on("disconnected",n=>{console.warn("[media-track] disconnected",n);}).on("error",n=>{console.error("[media-track] error: ",n);});}async getTokenValue(){return typeof this.accessToken=="string"?this.accessToken:await this.accessToken.getToken()}buildWsUrl(t,i){let n=new URL(t);return n.searchParams.set("token",i),n.toString()}async ensureInitialized(){e.isServer||(this.initPromise||this.connect(),await this.initPromise);}async translate(t,i,n){let r=await this._requestOptions(),s=w(t,i,n);return (await httpPost(`${this.endpoint}/translation`,s,r)).data.target_text}connect(){e.isServer||(this.initPromise=this.initClient().then(()=>{this.client.connect();}));}disconnect(){this.client&&this.client.disconnect(),this.initPromise=null;}subscribe(t,i){let n=this.listenersMap.get(t);return n||(n=new Set,this.listenersMap.set(t,n)),n.add(i),this.ensureInitialized().then(()=>{this.client.getSubscription(t)||(console.info("[media-track] create new sub: ",t),this.client.newSubscription(t,{delta:"fossil"}).on("subscribed",()=>{console.info("[media-track] subscribed",t);}).on("unsubscribed",()=>{console.info("[media-track] unsubscribed",t);}).on("publication",s=>{this.listenersMap.get(t)?.forEach(S=>S(s.data));}).subscribe());}),new a(this,t,i)}unsubscribe(t,i){let n=this.listenersMap.get(t);if(n&&(n.delete(i),console.info(`[media-track] unsubscribe ${t} listener, remain: ${n.size}`),n.size===0)){console.info(`[media-track] unsubscribe channel: ${t}`);let r=this.client.getSubscription(t);r&&(r.unsubscribe(),this.client.removeSubscription(r)),this.listenersMap.delete(t);}}subscribeTweetMedia({callback:t}){return this.subscribe("x-monitor-basic",i=>{try{t(o(i));}catch(n){console.error("[media-track] subscribeTweetMedia error: ",n);}})}subscribeTweetMediaToken({callback:t}){return this.subscribe("x-monitor-token",i=>{try{t(o(i));}catch(n){console.error("[media-track] subscribeTweetMediaToken error: ",n);}})}async generateMeme(t){let i=await this._requestOptions(),n=l(t),r=await httpPost(`${this.endpoint}/meme/generate`,n,i);return T(r.data)}async _requestOptions(){return {headers:{Authorization:`Bearer ${await this.getTokenValue()}`}}}},a=class{constructor(t,i,n){this.client=t;this.channel=i;this.fn=n;}unsubscribe(){this.client.unsubscribe(this.channel,this.fn);}};export{M as MediaTrackClient,T as convertFromGenerateMemeResult,G as convertFromSubscribedMediaToken,C as convertFromSubscribedSourceTweet,f as convertFromSubscribedTweet,p as convertFromSubscribedTweetContent,y as convertFromSubscribedTweetContentMedia,o as convertFromSubscribedTweetMedia,b as convertFromSubscribedTweetUser,l as toGenerateMemeParamsDTO,x as toGenerateTweetMemeParamsDTO,w as toTranslateParamsDTO,I as toTranslateTweetParamsDTO};//# sourceMappingURL=index.mjs.map
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/utils.ts","../../src/client/client.ts"],"names":["convertFromSubscribedTweetMedia","from","convertFromSubscribedMediaToken","convertFromSubscribedTweet","convertFromSubscribedSourceTweet","chain","Chain","chainIdBySlug","priceChange","SafeBigNumber","convertFromSubscribedTweetUser","convertFromSubscribedTweetContent","convertFromSubscribedTweetContentMedia","convertFromGenerateMemeResult","toTranslateParamsDTO","media","targetLanguage","options","toTranslateTweetParamsDTO","toGenerateMemeParamsDTO","toGenerateTweetMemeParamsDTO","MediaTrackClient","_MediaTrackClient","endpoint","streamEndpoint","accessToken","token","wsUrl","Centrifuge","err","url","requestOptions","params","httpPost","channel","fn","listeners","ctx","it","Subscription","sub","callback","data","error","res","client"],"mappings":"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","file":"index.mjs","sourcesContent":["import { LocaleCode } from \"@liberfi.io/i18n\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainIdBySlug, SafeBigNumber } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n MediaToken,\n SourceTweet,\n Tweet,\n TweetContent,\n TweetContentMedia,\n TweetMedia,\n TweetUser,\n} from \"../types\";\nimport {\n GenerateMemeResult,\n SubscribedMediaToken,\n SubscribedSourceTweet,\n SubscribedTweet,\n SubscribedTweetContent,\n SubscribedTweetContentMedia,\n SubscribedTweetMedia,\n SubscribedTweetUser,\n TranslateTweetRequest,\n} from \"./types\";\n\nexport function convertFromSubscribedTweetMedia(\n from: SubscribedTweetMedia,\n): TweetMedia {\n return {\n id: from.i,\n type: \"tweet\",\n tokenType: from.tt,\n token: from.t ? convertFromSubscribedMediaToken(from.t) : undefined,\n tweet: convertFromSubscribedTweet(from.tw),\n sourceTweet: from.s ? convertFromSubscribedSourceTweet(from.s) : undefined,\n };\n}\n\nexport function convertFromSubscribedMediaToken(\n from: SubscribedMediaToken,\n): MediaToken {\n const chain = from.c === \"sol\" ? Chain.SOLANA : chainIdBySlug(from.c);\n if (!chain) {\n throw new Error(`Unsupported chain: ${from.c}`);\n }\n const priceChange =\n from.p && from.p1 && new SafeBigNumber(from.p1).isPositive()\n ? new SafeBigNumber(from.p)\n .minus(from.p1)\n .div(from.p1)\n .times(100)\n .toString()\n : undefined;\n return {\n chain,\n address: from.a,\n symbol: from.s,\n image: from.i,\n latestPrice: from.p,\n previousPrice: from.p1,\n priceChange,\n };\n}\n\nexport function convertFromSubscribedTweet(from: SubscribedTweet): Tweet {\n return {\n tweetId: from.i,\n type: from.t,\n timestamp: Number(from.ts),\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedSourceTweet(\n from: SubscribedSourceTweet,\n): SourceTweet {\n return {\n tweetId: from.i,\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedTweetUser(\n from: SubscribedTweetUser,\n): TweetUser {\n return {\n username: from.s,\n screenName: from.n,\n avatar: from.a,\n tags: from.ut,\n };\n}\n\nexport function convertFromSubscribedTweetContent(\n from: SubscribedTweetContent,\n): TweetContent {\n return {\n text: from.t,\n medias: from.m\n ? from.m.map(convertFromSubscribedTweetContentMedia).filter(Boolean)\n : undefined,\n };\n}\n\nexport function convertFromSubscribedTweetContentMedia(\n from: SubscribedTweetContentMedia,\n): TweetContentMedia {\n return {\n type: from.t,\n url: from.u,\n };\n}\n\nexport function convertFromGenerateMemeResult(\n from: GenerateMemeResult,\n): GeneratedMemeInfo {\n return {\n symbol: from.ticker,\n name: from.coin_name,\n image: from.icon_url,\n };\n}\n\nexport function toTranslateParamsDTO(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n switch (media.type) {\n case \"tweet\":\n return toTranslateTweetParamsDTO(\n media as TweetMedia,\n targetLanguage,\n options,\n );\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateMemeParamsDTO(media: IMedia) {\n switch (media.type) {\n case \"tweet\":\n return toGenerateTweetMemeParamsDTO(media as TweetMedia);\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateTweetMemeParamsDTO(media: TweetMedia) {\n return {\n tweet_id: media.tweet.tweetId,\n tweet_info: media.tweet.content.text,\n };\n}\n\nexport function toTranslateTweetParamsDTO(\n media: TweetMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n return {\n res_type: \"tw\",\n res_id: options?.sourceTweet\n ? (media.sourceTweet?.tweetId ?? media.id)\n : media.id,\n source_lang: options?.sourceLanguage,\n target_lang: targetLanguage,\n text:\n (options?.sourceTweet\n ? media.sourceTweet?.content.text\n : media.tweet.content.text) ?? \"\",\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\nimport { Centrifuge } from \"@chainstream-io/centrifuge\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { ISubscription } from \"@liberfi.io/types\";\nimport { httpPost } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n IMediaTrackClient,\n SubscribeTweetMediasOptions,\n} from \"../types\";\nimport {\n GenerateMemeResponse,\n SubscribedTweetMedia,\n TranslateTweetResponse,\n} from \"./types\";\nimport {\n convertFromGenerateMemeResult,\n convertFromSubscribedTweetMedia,\n toGenerateMemeParamsDTO,\n toTranslateParamsDTO,\n} from \"./utils\";\n\nexport interface MediaTrackClientOptions {\n endpoint: string;\n streamEndpoint: string;\n accessToken:\n | string\n | {\n getToken(): Promise<string> | string;\n };\n}\n\nexport class MediaTrackClient implements IMediaTrackClient {\n private client!: Centrifuge;\n private listenersMap: Map<string, Set<(data: any) => void>>;\n private endpoint: string;\n private streamEndpoint: string;\n private accessToken: MediaTrackClientOptions[\"accessToken\"];\n private initPromise: Promise<void> | null = null;\n\n private static get isServer(): boolean {\n return typeof window === \"undefined\";\n }\n\n constructor({\n endpoint,\n streamEndpoint,\n accessToken,\n }: MediaTrackClientOptions) {\n this.endpoint = endpoint;\n this.streamEndpoint = streamEndpoint;\n this.accessToken = accessToken;\n this.listenersMap = new Map();\n\n if (!MediaTrackClient.isServer) {\n this.connect();\n }\n }\n\n private async initClient() {\n if (this.client) {\n return;\n }\n const token = await this.getTokenValue();\n const wsUrl = this.buildWsUrl(this.streamEndpoint, token);\n this.client = new Centrifuge(wsUrl, {\n getToken: async () => {\n return this.getTokenValue();\n },\n });\n\n this.client\n .on(\"connected\", () => {\n console.info(\"[media-track] connected\");\n })\n .on(\"disconnected\", (err) => {\n console.warn(\"[media-track] disconnected\", err);\n })\n .on(\"error\", (err) => {\n console.error(\"[media-track] error: \", err);\n });\n }\n\n private async getTokenValue(): Promise<string> {\n return typeof this.accessToken === \"string\"\n ? this.accessToken\n : await this.accessToken.getToken();\n }\n\n private buildWsUrl(endpoint: string, token: string): string {\n const url = new URL(endpoint);\n url.searchParams.set(\"token\", token);\n return url.toString();\n }\n\n private async ensureInitialized() {\n if (MediaTrackClient.isServer) return;\n if (!this.initPromise) {\n this.connect();\n }\n await this.initPromise;\n }\n\n async translate(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n ): Promise<string> {\n const requestOptions = await this._requestOptions();\n const params = toTranslateParamsDTO(media, targetLanguage, options);\n const res = await httpPost<TranslateTweetResponse>(\n `${this.endpoint}/translation`,\n params,\n requestOptions,\n );\n return res.data.target_text;\n }\n\n /**\n * Connect to the media track realtime server.\n * Lazily initializes the Centrifuge client on first call.\n * No-op when called during SSR (Node.js).\n */\n connect() {\n if (MediaTrackClient.isServer) return;\n this.initPromise = this.initClient().then(() => {\n this.client.connect();\n });\n }\n\n /**\n * Disconnect and release the underlying Centrifuge transport.\n */\n disconnect() {\n if (this.client) {\n this.client.disconnect();\n }\n this.initPromise = null;\n }\n\n subscribe<T = any>(channel: string, fn: (data: T) => void): ISubscription {\n let listeners = this.listenersMap.get(channel);\n if (!listeners) {\n listeners = new Set();\n this.listenersMap.set(channel, listeners);\n }\n listeners.add(fn);\n\n void this.ensureInitialized().then(() => {\n if (!this.client.getSubscription(channel)) {\n console.info(\"[media-track] create new sub: \", channel);\n\n const sub = this.client.newSubscription(channel, {\n delta: \"fossil\",\n });\n\n sub\n .on(\"subscribed\", () => {\n console.info(\"[media-track] subscribed\", channel);\n })\n .on(\"unsubscribed\", () => {\n console.info(\"[media-track] unsubscribed\", channel);\n })\n .on(\"publication\", (ctx) => {\n const ls = this.listenersMap.get(channel);\n ls?.forEach((it) => it(ctx.data));\n })\n .subscribe();\n }\n });\n\n return new Subscription<T>(this, channel, fn);\n }\n\n unsubscribe<T = any>(channel: string, fn: (data: T) => void) {\n const listeners = this.listenersMap.get(channel);\n if (!listeners) return;\n\n listeners.delete(fn);\n console.info(\n `[media-track] unsubscribe ${channel} listener, remain: ${listeners.size}`,\n );\n\n if (listeners.size === 0) {\n console.info(`[media-track] unsubscribe channel: ${channel}`);\n\n const sub = this.client.getSubscription(channel);\n if (sub) {\n sub.unsubscribe();\n this.client.removeSubscription(sub);\n }\n\n this.listenersMap.delete(channel);\n }\n }\n\n subscribeTweetMedia({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-basic\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMedia error: \", error);\n }\n });\n }\n\n subscribeTweetMediaToken({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-token\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMediaToken error: \", error);\n }\n });\n }\n\n async generateMeme(media: IMedia): Promise<GeneratedMemeInfo> {\n const requestOptions = await this._requestOptions();\n const params = toGenerateMemeParamsDTO(media);\n const res = await httpPost<GenerateMemeResponse>(\n `${this.endpoint}/meme/generate`,\n params,\n requestOptions,\n );\n return convertFromGenerateMemeResult(res.data);\n }\n\n async _requestOptions(): Promise<Omit<RequestInit, \"method\">> {\n const token = await this.getTokenValue();\n return {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n };\n }\n}\n\nclass Subscription<T> {\n constructor(\n private readonly client: MediaTrackClient,\n private readonly channel: string,\n private readonly fn: (data: T) => void,\n ) {}\n\n unsubscribe() {\n this.client.unsubscribe(this.channel, this.fn);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/utils.ts","../../src/client/client.ts"],"names":["convertFromSubscribedTweetMedia","from","tryConvertFromSubscribedMediaToken","convertFromSubscribedTweet","convertFromSubscribedSourceTweet","resolveSubscribedMediaTokenChain","slug","Chain","chainIdBySlug","chain","createMediaToken","convertFromSubscribedMediaToken","priceChange","SafeBigNumber","convertFromSubscribedTweetUser","convertFromSubscribedTweetContent","convertFromSubscribedTweetContentMedia","convertFromGenerateMemeResult","toTranslateParamsDTO","media","targetLanguage","options","toTranslateTweetParamsDTO","toGenerateMemeParamsDTO","toGenerateTweetMemeParamsDTO","MediaTrackClient","_MediaTrackClient","endpoint","streamEndpoint","accessToken","token","wsUrl","Centrifuge","err","url","requestOptions","params","httpPost","channel","fn","listeners","ctx","it","Subscription","sub","callback","data","error","res","client"],"mappings":"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","file":"index.mjs","sourcesContent":["import { LocaleCode } from \"@liberfi.io/i18n\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainIdBySlug, SafeBigNumber } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n MediaToken,\n SourceTweet,\n Tweet,\n TweetContent,\n TweetContentMedia,\n TweetMedia,\n TweetUser,\n} from \"../types\";\nimport {\n GenerateMemeResult,\n SubscribedMediaToken,\n SubscribedSourceTweet,\n SubscribedTweet,\n SubscribedTweetContent,\n SubscribedTweetContentMedia,\n SubscribedTweetMedia,\n SubscribedTweetUser,\n TranslateTweetRequest,\n} from \"./types\";\n\nexport function convertFromSubscribedTweetMedia(\n from: SubscribedTweetMedia,\n): TweetMedia {\n return {\n id: from.i,\n type: \"tweet\",\n tokenType: from.tt,\n // Token metadata is optional enrichment; an unknown chain must not drop the tweet.\n token: from.t ? tryConvertFromSubscribedMediaToken(from.t) : undefined,\n tweet: convertFromSubscribedTweet(from.tw),\n sourceTweet: from.s ? convertFromSubscribedSourceTweet(from.s) : undefined,\n };\n}\n\nfunction resolveSubscribedMediaTokenChain(slug: string): Chain | undefined {\n return slug === \"sol\" ? Chain.SOLANA : chainIdBySlug(slug);\n}\n\nfunction tryConvertFromSubscribedMediaToken(\n from: SubscribedMediaToken,\n): MediaToken | undefined {\n const chain = resolveSubscribedMediaTokenChain(from.c);\n return chain ? createMediaToken(from, chain) : undefined;\n}\n\nexport function convertFromSubscribedMediaToken(\n from: SubscribedMediaToken,\n): MediaToken {\n const chain = resolveSubscribedMediaTokenChain(from.c);\n if (!chain) {\n throw new Error(`Unsupported chain: ${from.c}`);\n }\n return createMediaToken(from, chain);\n}\n\nfunction createMediaToken(\n from: SubscribedMediaToken,\n chain: Chain,\n): MediaToken {\n const priceChange =\n from.p && from.p1 && new SafeBigNumber(from.p1).isPositive()\n ? new SafeBigNumber(from.p)\n .minus(from.p1)\n .div(from.p1)\n .times(100)\n .toString()\n : undefined;\n return {\n chain,\n address: from.a,\n symbol: from.s,\n image: from.i,\n latestPrice: from.p,\n previousPrice: from.p1,\n priceChange,\n };\n}\n\nexport function convertFromSubscribedTweet(from: SubscribedTweet): Tweet {\n return {\n tweetId: from.i,\n type: from.t,\n timestamp: Number(from.ts),\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedSourceTweet(\n from: SubscribedSourceTweet,\n): SourceTweet {\n return {\n tweetId: from.i,\n user: convertFromSubscribedTweetUser(from.u),\n content: convertFromSubscribedTweetContent(from.c),\n };\n}\n\nexport function convertFromSubscribedTweetUser(\n from: SubscribedTweetUser,\n): TweetUser {\n return {\n username: from.s,\n screenName: from.n,\n avatar: from.a,\n tags: from.ut,\n };\n}\n\nexport function convertFromSubscribedTweetContent(\n from: SubscribedTweetContent,\n): TweetContent {\n return {\n text: from.t,\n medias: from.m\n ? from.m.map(convertFromSubscribedTweetContentMedia).filter(Boolean)\n : undefined,\n };\n}\n\nexport function convertFromSubscribedTweetContentMedia(\n from: SubscribedTweetContentMedia,\n): TweetContentMedia {\n return {\n type: from.t,\n url: from.u,\n };\n}\n\nexport function convertFromGenerateMemeResult(\n from: GenerateMemeResult,\n): GeneratedMemeInfo {\n return {\n symbol: from.ticker,\n name: from.coin_name,\n image: from.icon_url,\n };\n}\n\nexport function toTranslateParamsDTO(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n switch (media.type) {\n case \"tweet\":\n return toTranslateTweetParamsDTO(\n media as TweetMedia,\n targetLanguage,\n options,\n );\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateMemeParamsDTO(media: IMedia) {\n switch (media.type) {\n case \"tweet\":\n return toGenerateTweetMemeParamsDTO(media as TweetMedia);\n default:\n throw new Error(`Unsupported media type: ${media.type}`);\n }\n}\n\nexport function toGenerateTweetMemeParamsDTO(media: TweetMedia) {\n return {\n tweet_id: media.tweet.tweetId,\n tweet_info: media.tweet.content.text,\n };\n}\n\nexport function toTranslateTweetParamsDTO(\n media: TweetMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n): TranslateTweetRequest {\n return {\n res_type: \"tw\",\n res_id: options?.sourceTweet\n ? (media.sourceTweet?.tweetId ?? media.id)\n : media.id,\n source_lang: options?.sourceLanguage,\n target_lang: targetLanguage,\n text:\n (options?.sourceTweet\n ? media.sourceTweet?.content.text\n : media.tweet.content.text) ?? \"\",\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\nimport { Centrifuge } from \"@chainstream-io/centrifuge\";\nimport { LocaleCode } from \"@liberfi.io/i18n\";\nimport { ISubscription } from \"@liberfi.io/types\";\nimport { httpPost } from \"@liberfi.io/utils\";\nimport {\n GeneratedMemeInfo,\n IMedia,\n IMediaTrackClient,\n SubscribeTweetMediasOptions,\n} from \"../types\";\nimport {\n GenerateMemeResponse,\n SubscribedTweetMedia,\n TranslateTweetResponse,\n} from \"./types\";\nimport {\n convertFromGenerateMemeResult,\n convertFromSubscribedTweetMedia,\n toGenerateMemeParamsDTO,\n toTranslateParamsDTO,\n} from \"./utils\";\n\nexport interface MediaTrackClientOptions {\n endpoint: string;\n streamEndpoint: string;\n accessToken:\n | string\n | {\n getToken(): Promise<string> | string;\n };\n}\n\nexport class MediaTrackClient implements IMediaTrackClient {\n private client!: Centrifuge;\n private listenersMap: Map<string, Set<(data: any) => void>>;\n private endpoint: string;\n private streamEndpoint: string;\n private accessToken: MediaTrackClientOptions[\"accessToken\"];\n private initPromise: Promise<void> | null = null;\n\n private static get isServer(): boolean {\n return typeof window === \"undefined\";\n }\n\n constructor({\n endpoint,\n streamEndpoint,\n accessToken,\n }: MediaTrackClientOptions) {\n this.endpoint = endpoint;\n this.streamEndpoint = streamEndpoint;\n this.accessToken = accessToken;\n this.listenersMap = new Map();\n\n if (!MediaTrackClient.isServer) {\n this.connect();\n }\n }\n\n private async initClient() {\n if (this.client) {\n return;\n }\n const token = await this.getTokenValue();\n const wsUrl = this.buildWsUrl(this.streamEndpoint, token);\n this.client = new Centrifuge(wsUrl, {\n getToken: async () => {\n return this.getTokenValue();\n },\n });\n\n this.client\n .on(\"connected\", () => {\n console.info(\"[media-track] connected\");\n })\n .on(\"disconnected\", (err) => {\n console.warn(\"[media-track] disconnected\", err);\n })\n .on(\"error\", (err) => {\n console.error(\"[media-track] error: \", err);\n });\n }\n\n private async getTokenValue(): Promise<string> {\n return typeof this.accessToken === \"string\"\n ? this.accessToken\n : await this.accessToken.getToken();\n }\n\n private buildWsUrl(endpoint: string, token: string): string {\n const url = new URL(endpoint);\n url.searchParams.set(\"token\", token);\n return url.toString();\n }\n\n private async ensureInitialized() {\n if (MediaTrackClient.isServer) return;\n if (!this.initPromise) {\n this.connect();\n }\n await this.initPromise;\n }\n\n async translate(\n media: IMedia,\n targetLanguage: LocaleCode,\n options?: { sourceLanguage?: LocaleCode; sourceTweet?: boolean },\n ): Promise<string> {\n const requestOptions = await this._requestOptions();\n const params = toTranslateParamsDTO(media, targetLanguage, options);\n const res = await httpPost<TranslateTweetResponse>(\n `${this.endpoint}/translation`,\n params,\n requestOptions,\n );\n return res.data.target_text;\n }\n\n /**\n * Connect to the media track realtime server.\n * Lazily initializes the Centrifuge client on first call.\n * No-op when called during SSR (Node.js).\n */\n connect() {\n if (MediaTrackClient.isServer) return;\n this.initPromise = this.initClient().then(() => {\n this.client.connect();\n });\n }\n\n /**\n * Disconnect and release the underlying Centrifuge transport.\n */\n disconnect() {\n if (this.client) {\n this.client.disconnect();\n }\n this.initPromise = null;\n }\n\n subscribe<T = any>(channel: string, fn: (data: T) => void): ISubscription {\n let listeners = this.listenersMap.get(channel);\n if (!listeners) {\n listeners = new Set();\n this.listenersMap.set(channel, listeners);\n }\n listeners.add(fn);\n\n void this.ensureInitialized().then(() => {\n if (!this.client.getSubscription(channel)) {\n console.info(\"[media-track] create new sub: \", channel);\n\n const sub = this.client.newSubscription(channel, {\n delta: \"fossil\",\n });\n\n sub\n .on(\"subscribed\", () => {\n console.info(\"[media-track] subscribed\", channel);\n })\n .on(\"unsubscribed\", () => {\n console.info(\"[media-track] unsubscribed\", channel);\n })\n .on(\"publication\", (ctx) => {\n const ls = this.listenersMap.get(channel);\n ls?.forEach((it) => it(ctx.data));\n })\n .subscribe();\n }\n });\n\n return new Subscription<T>(this, channel, fn);\n }\n\n unsubscribe<T = any>(channel: string, fn: (data: T) => void) {\n const listeners = this.listenersMap.get(channel);\n if (!listeners) return;\n\n listeners.delete(fn);\n console.info(\n `[media-track] unsubscribe ${channel} listener, remain: ${listeners.size}`,\n );\n\n if (listeners.size === 0) {\n console.info(`[media-track] unsubscribe channel: ${channel}`);\n\n const sub = this.client.getSubscription(channel);\n if (sub) {\n sub.unsubscribe();\n this.client.removeSubscription(sub);\n }\n\n this.listenersMap.delete(channel);\n }\n }\n\n subscribeTweetMedia({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-basic\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMedia error: \", error);\n }\n });\n }\n\n subscribeTweetMediaToken({\n callback,\n }: SubscribeTweetMediasOptions): ISubscription {\n return this.subscribe(\"x-monitor-token\", (data: SubscribedTweetMedia) => {\n try {\n callback(convertFromSubscribedTweetMedia(data));\n } catch (error) {\n console.error(\"[media-track] subscribeTweetMediaToken error: \", error);\n }\n });\n }\n\n async generateMeme(media: IMedia): Promise<GeneratedMemeInfo> {\n const requestOptions = await this._requestOptions();\n const params = toGenerateMemeParamsDTO(media);\n const res = await httpPost<GenerateMemeResponse>(\n `${this.endpoint}/meme/generate`,\n params,\n requestOptions,\n );\n return convertFromGenerateMemeResult(res.data);\n }\n\n async _requestOptions(): Promise<Omit<RequestInit, \"method\">> {\n const token = await this.getTokenValue();\n return {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n };\n }\n}\n\nclass Subscription<T> {\n constructor(\n private readonly client: MediaTrackClient,\n private readonly channel: string,\n private readonly fn: (data: T) => void,\n ) {}\n\n unsubscribe() {\n this.client.unsubscribe(this.channel, this.fn);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liberfi.io/ui-media-track",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.277",
|
|
4
4
|
"description": "Media Track for Liberfi React SDK",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@chainstream-io/centrifuge": "^1.0.0",
|
|
30
30
|
"tailwind-variants": "^3.1.1",
|
|
31
|
-
"@liberfi.io/hooks": "0.1.
|
|
32
|
-
"@liberfi.io/i18n": "0.1.
|
|
33
|
-
"@liberfi.io/types": "0.4.
|
|
34
|
-
"@liberfi.io/ui": "0.3.
|
|
35
|
-
"@liberfi.io/utils": "0.2.
|
|
31
|
+
"@liberfi.io/hooks": "0.1.274",
|
|
32
|
+
"@liberfi.io/i18n": "0.1.279",
|
|
33
|
+
"@liberfi.io/types": "0.4.82",
|
|
34
|
+
"@liberfi.io/ui": "0.3.82",
|
|
35
|
+
"@liberfi.io/utils": "0.2.81"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@tanstack/react-query": "^5.90.2",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"ts-jest": "^29.4.6",
|
|
47
47
|
"tsup": "^8.5.0",
|
|
48
48
|
"typescript": "^5.9.2",
|
|
49
|
-
"tsconfig": "0.1.
|
|
49
|
+
"tsconfig": "0.1.265"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"@tanstack/react-query": "^5.90.2",
|