@magic-ext/farcaster 0.0.3 → 0.0.4-canary.63b6ce3.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/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +3 -3
- package/dist/es/index.js +1 -1
- package/dist/es/index.js.map +3 -3
- package/dist/es/index.mjs +1 -1
- package/dist/es/index.mjs.map +3 -3
- package/dist/extension.js +39 -39
- package/package.json +2 -2
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var h=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,P=Object.prototype.propertyIsEnumerable;var y=(n,e,t)=>e in n?h(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,I=(n,e)=>{for(var t in e||(e={}))A.call(e,t)&&y(n,t,e[t]);if(b)for(var t of b(e))P.call(e,t)&&y(n,t,e[t]);return n};var L=(n,e)=>{for(var t in e)h(n,t,{get:e[t],enumerable:!0})},S=(n,e,t,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of k(e))!A.call(n,r)&&r!==t&&h(n,r,{get:()=>e[r],enumerable:!(l=w(e,r))||l.enumerable});return n};var T=n=>S(h({},"__esModule",{value:!0}),n);var g=(n,e,t)=>new Promise((l,r)=>{var f=s=>{try{c(t.next(s))}catch(u){r(u)}},o=s=>{try{c(t.throw(s))}catch(u){r(u)}},c=s=>s.done?l(s.value):Promise.resolve(s.value).then(f,o);c((t=t.apply(n,e)).next())});var J={};L(J,{FarcasterExtension:()=>C});module.exports=T(J);var m=require("@magic-sdk/commons"),p=require("@farcaster/auth-client");function x(){return typeof navigator!="undefined"&&/android/i.test(navigator.userAgent)}function U(){return typeof navigator!="undefined"&&/iPhone|iPod/.test(navigator.userAgent)}function D(){return typeof navigator!="undefined"&&(/iPad/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)}function _(){return U()||D()}function R(){return x()||_()}var v={CHANNEL:"channel",DONE:"done",ERROR:"error"},H=n=>typeof n=="function",F=n=>typeof n=="function",O="https://relay.farcaster.xyz",N="https://example.com/login",q=6e4,W=500,C=class extends m.Extension.Internal{constructor(){super(...arguments);this.name="farcaster";this.config={};this.login=({showUI:t})=>{let l=(0,p.createAppClient)({relay:O,ethereum:(0,p.viemConnector)()}),r=l.createChannel({siweUri:N,domain:window.location.host}),f=r.then(({data:d})=>l.watchStatus({channelToken:d.channelToken,timeout:q,interval:W}).then(i=>{if(i.isError)throw i.error;return i})),o=null,c,s,u;R()&&(console.info("Info: showUI parameter is ignored on mobile, open URL directly"),o=window.open());let E={on:(d,i)=>(d==="channel"&&g(this,null,function*(){let{data:a}=yield r;!H(i)||(i(a),u=a.channelToken,R()&&(o==null||o.location.assign(a.url)),c=this.utils.createJsonRpcRequestPayload("farcaster_show_QR",[{data:I({showUI:t},a)}]),s=this.request(c))}),d===v.DONE&&g(this,null,function*(){let{data:a}=yield f;a.state==="completed"&&(this.createIntermediaryEvent(m.FarcasterLoginEventEmit.SuccessSignIn,c.id)({channel_token:u,message:a.message,signature:a.signature,fid:a.fid,username:a.username}),yield s,F(i)&&(o==null||o.close(),i(a)))}),d===v.ERROR&&f.catch(a=>{o==null||o.close(),i(a)}),E)};return E}}};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts", "../../src/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { Extension, FarcasterLoginEventEmit, JsonRpcRequestPayload } from '@magic-sdk/commons';\nimport type {\n CreateChannelAPIResponse,\n AuthenticateAPIResponse,\n WatchStatusResponse,\n AuthClientError,\n} from '@farcaster/auth-client';\nimport { createAppClient, viemConnector } from '@farcaster/auth-client';\nimport { FarcasterPayloadMethod } from './types';\nimport { isMobile } from './utils';\n\ntype Handle = {\n on: Handler;\n};\n\nconst EVENT = {\n CHANNEL: 'channel',\n DONE: 'done',\n ERROR: 'error',\n} as const;\n\ntype ChannelCallback = (params: CreateChannelAPIResponse) => void;\ntype DoneCallback = (params: AuthenticateAPIResponse) => void;\ntype ErrorCallback = (params: AuthClientError) => void;\n\nconst isChannelCallback = (callback: Function): callback is ChannelCallback => typeof callback === 'function';\nconst isDoneCallback = (callback: Function): callback is DoneCallback => typeof callback === 'function';\n\ninterface Handler {\n (event: 'channel', callback: ChannelCallback): Handle;\n (event: 'done', callback: DoneCallback): Handle;\n (event: 'error', callback: ErrorCallback): Handle;\n}\n\nconst DEFAULT_RELAY_URL = 'https://relay.farcaster.xyz';\nconst DEFAULT_SIWE_URI = 'https://example.com/login';\nconst DEFAULT_TIMEOUT = 60000;\nconst DEFAULT_INTERVAL = 500;\n\nexport class FarcasterExtension extends Extension.Internal<'farcaster'> {\n name = 'farcaster' as const;\n config = {};\n\n public login = ({ showUI }: { showUI: boolean }): Handle => {\n const appClient = createAppClient({\n relay: DEFAULT_RELAY_URL,\n ethereum: viemConnector(),\n });\n\n const channelPromise = appClient.createChannel({\n siweUri: DEFAULT_SIWE_URI,\n domain: window.location.host,\n });\n\n const statusPromise: WatchStatusResponse = channelPromise.then(({ data }) => {\n return appClient\n .watchStatus({\n channelToken: data.channelToken,\n timeout: DEFAULT_TIMEOUT,\n interval: DEFAULT_INTERVAL,\n })\n .then((r) => {\n if (r.isError) {\n throw r.error;\n } else {\n return r;\n }\n });\n });\n\n let requestPayload: JsonRpcRequestPayload;\n let channel_token: string;\n\n const handle: Handle = {\n on: (event, callback) => {\n if (event === 'channel') {\n (async () => {\n const { data } = await channelPromise;\n\n if (!isChannelCallback(callback)) return;\n\n callback(data);\n\n channel_token = data.channelToken;\n\n if (isMobile()) {\n
|
|
5
|
-
"mappings": "y4BAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA0E,8BAO1EC,EAA+C,kCCLxC,SAASC,GAAqB,CACnC,OAAO,OAAO,WAAc,aAAe,WAAW,KAAK,UAAU,SAAS,CAChF,CAEO,SAASC,GAAsB,CACpC,OAAO,OAAO,WAAc,aAAe,cAAc,KAAK,UAAU,SAAS,CACnF,CAEO,SAASC,GAAsB,CACpC,OACE,OAAO,WAAc,cACpB,OAAO,KAAK,UAAU,SAAS,GAAM,UAAU,WAAa,YAAc,UAAU,eAAiB,EAE1G,CAEO,SAASC,GAAiB,CAC/B,OAAOF,EAAW,GAAKC,EAAW,CACpC,CAEO,SAASE,GAAoB,CAClC,OAAOJ,EAAU,GAAKG,EAAM,CAC9B,CDRA,IAAME,EAAQ,CACZ,QAAS,UACT,KAAM,OACN,MAAO,OACT,EAMMC,EAAqBC,GAAoD,OAAOA,GAAa,WAC7FC,EAAkBD,GAAiD,OAAOA,GAAa,WAQvFE,EAAoB,8BACpBC,EAAmB,4BACnBC,EAAkB,IAClBC,EAAmB,IAEZC,EAAN,cAAiC,YAAU,QAAsB,CAAjE,kCACL,UAAO,YACP,YAAS,CAAC,EAEV,KAAO,MAAQ,CAAC,CAAE,OAAAC,CAAO,IAAmC,CAC1D,IAAMC,KAAY,mBAAgB,CAChC,MAAON,EACP,YAAU,iBAAc,CAC1B,CAAC,EAEKO,EAAiBD,EAAU,cAAc,CAC7C,QAASL,EACT,OAAQ,OAAO,SAAS,IAC1B,CAAC,EAEKO,EAAqCD,EAAe,KAAK,CAAC,CAAE,KAAAE,CAAK,IAC9DH,EACJ,YAAY,CACX,aAAcG,EAAK,aACnB,QAASP,EACT,SAAUC,CACZ,CAAC,EACA,KAAMO,GAAM,CACX,GAAIA,EAAE,QACJ,MAAMA,EAAE,MAER,OAAOA,CAEX,CAAC,CACJ,EAEGC,EACAC,
|
|
6
|
-
"names": ["src_exports", "__export", "FarcasterExtension", "__toCommonJS", "import_commons", "import_auth_client", "isAndroid", "isSmallIOS", "isLargeIOS", "isIOS", "isMobile", "EVENT", "isChannelCallback", "callback", "isDoneCallback", "DEFAULT_RELAY_URL", "DEFAULT_SIWE_URI", "DEFAULT_TIMEOUT", "DEFAULT_INTERVAL", "FarcasterExtension", "showUI", "appClient", "channelPromise", "statusPromise", "data", "r", "requestPayload", "channel_token", "
|
|
4
|
+
"sourcesContent": ["import { Extension, FarcasterLoginEventEmit, JsonRpcRequestPayload } from '@magic-sdk/commons';\nimport type {\n CreateChannelAPIResponse,\n AuthenticateAPIResponse,\n WatchStatusResponse,\n AuthClientError,\n} from '@farcaster/auth-client';\nimport { createAppClient, viemConnector } from '@farcaster/auth-client';\nimport { FarcasterPayloadMethod } from './types';\nimport { isMobile } from './utils';\n\ntype Handle = {\n on: Handler;\n};\n\nconst EVENT = {\n CHANNEL: 'channel',\n DONE: 'done',\n ERROR: 'error',\n} as const;\n\ntype ChannelCallback = (params: CreateChannelAPIResponse) => void;\ntype DoneCallback = (params: AuthenticateAPIResponse) => void;\ntype ErrorCallback = (params: AuthClientError) => void;\n\nconst isChannelCallback = (callback: Function): callback is ChannelCallback => typeof callback === 'function';\nconst isDoneCallback = (callback: Function): callback is DoneCallback => typeof callback === 'function';\n\ninterface Handler {\n (event: 'channel', callback: ChannelCallback): Handle;\n (event: 'done', callback: DoneCallback): Handle;\n (event: 'error', callback: ErrorCallback): Handle;\n}\n\nconst DEFAULT_RELAY_URL = 'https://relay.farcaster.xyz';\nconst DEFAULT_SIWE_URI = 'https://example.com/login';\nconst DEFAULT_TIMEOUT = 60000;\nconst DEFAULT_INTERVAL = 500;\n\nexport class FarcasterExtension extends Extension.Internal<'farcaster'> {\n name = 'farcaster' as const;\n config = {};\n\n public login = ({ showUI }: { showUI: boolean }): Handle => {\n const appClient = createAppClient({\n relay: DEFAULT_RELAY_URL,\n ethereum: viemConnector(),\n });\n\n const channelPromise = appClient.createChannel({\n siweUri: DEFAULT_SIWE_URI,\n domain: window.location.host,\n });\n\n const statusPromise: WatchStatusResponse = channelPromise.then(({ data }) => {\n return appClient\n .watchStatus({\n channelToken: data.channelToken,\n timeout: DEFAULT_TIMEOUT,\n interval: DEFAULT_INTERVAL,\n })\n .then((r) => {\n if (r.isError) {\n throw r.error;\n } else {\n return r;\n }\n });\n });\n\n let popup: Window | null = null;\n let requestPayload: JsonRpcRequestPayload;\n let rpcPromise: Promise<void> | null;\n let channel_token: string;\n\n if (isMobile()) {\n console.info('Info: showUI parameter is ignored on mobile, open URL directly');\n popup = window.open();\n }\n\n const handle: Handle = {\n on: (event, callback) => {\n if (event === 'channel') {\n (async () => {\n const { data } = await channelPromise;\n\n if (!isChannelCallback(callback)) return;\n\n callback(data);\n\n channel_token = data.channelToken;\n\n if (isMobile()) {\n popup?.location.assign(data.url);\n }\n\n requestPayload = this.utils.createJsonRpcRequestPayload(FarcasterPayloadMethod.FarcasterShowQR, [\n { data: { showUI, ...data } },\n ]);\n\n rpcPromise = this.request(requestPayload);\n })();\n }\n if (event === EVENT.DONE) {\n (async () => {\n const { data } = await statusPromise;\n\n if (data.state !== 'completed') return;\n\n this.createIntermediaryEvent(\n FarcasterLoginEventEmit.SuccessSignIn,\n requestPayload.id as string,\n )({\n channel_token,\n message: data.message,\n signature: data.signature,\n fid: data.fid,\n username: data.username,\n });\n\n await rpcPromise;\n\n if (!isDoneCallback(callback)) return;\n\n popup?.close();\n\n callback(data);\n })();\n }\n if (event === EVENT.ERROR) {\n statusPromise.catch((e) => {\n popup?.close();\n callback(e);\n });\n }\n\n return handle;\n },\n };\n\n return handle;\n };\n}\n", "// https://github.com/farcasterxyz/auth-monorepo/blob/main/packages/auth-kit/src/utils.ts\n\nexport function isAndroid(): boolean {\n return typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent);\n}\n\nexport function isSmallIOS(): boolean {\n return typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent);\n}\n\nexport function isLargeIOS(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n (/iPad/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1))\n );\n}\n\nexport function isIOS(): boolean {\n return isSmallIOS() || isLargeIOS();\n}\n\nexport function isMobile(): boolean {\n return isAndroid() || isIOS();\n}\n"],
|
|
5
|
+
"mappings": "y4BAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA0E,8BAO1EC,EAA+C,kCCLxC,SAASC,GAAqB,CACnC,OAAO,OAAO,WAAc,aAAe,WAAW,KAAK,UAAU,SAAS,CAChF,CAEO,SAASC,GAAsB,CACpC,OAAO,OAAO,WAAc,aAAe,cAAc,KAAK,UAAU,SAAS,CACnF,CAEO,SAASC,GAAsB,CACpC,OACE,OAAO,WAAc,cACpB,OAAO,KAAK,UAAU,SAAS,GAAM,UAAU,WAAa,YAAc,UAAU,eAAiB,EAE1G,CAEO,SAASC,GAAiB,CAC/B,OAAOF,EAAW,GAAKC,EAAW,CACpC,CAEO,SAASE,GAAoB,CAClC,OAAOJ,EAAU,GAAKG,EAAM,CAC9B,CDRA,IAAME,EAAQ,CACZ,QAAS,UACT,KAAM,OACN,MAAO,OACT,EAMMC,EAAqBC,GAAoD,OAAOA,GAAa,WAC7FC,EAAkBD,GAAiD,OAAOA,GAAa,WAQvFE,EAAoB,8BACpBC,EAAmB,4BACnBC,EAAkB,IAClBC,EAAmB,IAEZC,EAAN,cAAiC,YAAU,QAAsB,CAAjE,kCACL,UAAO,YACP,YAAS,CAAC,EAEV,KAAO,MAAQ,CAAC,CAAE,OAAAC,CAAO,IAAmC,CAC1D,IAAMC,KAAY,mBAAgB,CAChC,MAAON,EACP,YAAU,iBAAc,CAC1B,CAAC,EAEKO,EAAiBD,EAAU,cAAc,CAC7C,QAASL,EACT,OAAQ,OAAO,SAAS,IAC1B,CAAC,EAEKO,EAAqCD,EAAe,KAAK,CAAC,CAAE,KAAAE,CAAK,IAC9DH,EACJ,YAAY,CACX,aAAcG,EAAK,aACnB,QAASP,EACT,SAAUC,CACZ,CAAC,EACA,KAAMO,GAAM,CACX,GAAIA,EAAE,QACJ,MAAMA,EAAE,MAER,OAAOA,CAEX,CAAC,CACJ,EAEGC,EAAuB,KACvBC,EACAC,EACAC,EAEAC,EAAS,IACX,QAAQ,KAAK,gEAAgE,EAC7EJ,EAAQ,OAAO,KAAK,GAGtB,IAAMK,EAAiB,CACrB,GAAI,CAACC,EAAOnB,KACNmB,IAAU,WACCC,EAAA,sBACX,GAAM,CAAE,KAAAT,CAAK,EAAI,MAAMF,EAEnB,CAACV,EAAkBC,CAAQ,IAE/BA,EAASW,CAAI,EAEbK,EAAgBL,EAAK,aAEjBM,EAAS,IACXJ,GAAA,MAAAA,EAAO,SAAS,OAAOF,EAAK,MAG9BG,EAAiB,KAAK,MAAM,gDAAoE,CAC9F,CAAE,KAAMO,EAAA,CAAE,OAAAd,GAAWI,EAAO,CAC9B,CAAC,EAEDI,EAAa,KAAK,QAAQD,CAAc,EAC1C,GAEEK,IAAUrB,EAAM,MACLsB,EAAA,sBACX,GAAM,CAAE,KAAAT,CAAK,EAAI,MAAMD,EAEnBC,EAAK,QAAU,cAEnB,KAAK,wBACH,0BAAwB,cACxBG,EAAe,EACjB,EAAE,CACA,cAAAE,EACA,QAASL,EAAK,QACd,UAAWA,EAAK,UAChB,IAAKA,EAAK,IACV,SAAUA,EAAK,QACjB,CAAC,EAED,MAAMI,EAEDd,EAAeD,CAAQ,IAE5Ba,GAAA,MAAAA,EAAO,QAEPb,EAASW,CAAI,GACf,GAEEQ,IAAUrB,EAAM,OAClBY,EAAc,MAAOY,GAAM,CACzBT,GAAA,MAAAA,EAAO,QACPb,EAASsB,CAAC,CACZ,CAAC,EAGIJ,EAEX,EAEA,OAAOA,CACT,EACF",
|
|
6
|
+
"names": ["src_exports", "__export", "FarcasterExtension", "__toCommonJS", "import_commons", "import_auth_client", "isAndroid", "isSmallIOS", "isLargeIOS", "isIOS", "isMobile", "EVENT", "isChannelCallback", "callback", "isDoneCallback", "DEFAULT_RELAY_URL", "DEFAULT_SIWE_URI", "DEFAULT_TIMEOUT", "DEFAULT_INTERVAL", "FarcasterExtension", "showUI", "appClient", "channelPromise", "statusPromise", "data", "r", "popup", "requestPayload", "rpcPromise", "channel_token", "isMobile", "handle", "event", "__async", "__spreadValues", "e"]
|
|
7
7
|
}
|
package/dist/es/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var y=Object.defineProperty;var g=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var R=(n,t,e)=>t in n?y(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,C=(n,t)=>{for(var e in t||(t={}))A.call(t,e)&&R(n,e,t[e]);if(g)for(var e of g(t))I.call(t,e)&&R(n,e,t[e]);return n};var h=(n,t,e)=>new Promise((d,c)=>{var f=r=>{try{i(e.next(r))}catch(l){c(l)}},o=r=>{try{i(e.throw(r))}catch(l){c(l)}},i=r=>r.done?d(r.value):Promise.resolve(r.value).then(f,o);i((e=e.apply(n,t)).next())});import{Extension as L,FarcasterLoginEventEmit as S}from"@magic-sdk/commons";import{createAppClient as T,viemConnector as x}from"@farcaster/auth-client";function v(){return typeof navigator!="undefined"&&/android/i.test(navigator.userAgent)}function w(){return typeof navigator!="undefined"&&/iPhone|iPod/.test(navigator.userAgent)}function k(){return typeof navigator!="undefined"&&(/iPad/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)}function P(){return w()||k()}function m(){return v()||P()}var E={CHANNEL:"channel",DONE:"done",ERROR:"error"},U=n=>typeof n=="function",D=n=>typeof n=="function",_="https://relay.farcaster.xyz",H="https://example.com/login",F=6e4,O=500,b=class extends L.Internal{constructor(){super(...arguments);this.name="farcaster";this.config={};this.login=({showUI:e})=>{let d=T({relay:_,ethereum:x()}),c=d.createChannel({siweUri:H,domain:window.location.host}),f=c.then(({data:u})=>d.watchStatus({channelToken:u.channelToken,timeout:F,interval:O}).then(s=>{if(s.isError)throw s.error;return s})),o=null,i,r,l;m()&&(console.info("Info: showUI parameter is ignored on mobile, open URL directly"),o=window.open());let p={on:(u,s)=>(u==="channel"&&h(this,null,function*(){let{data:a}=yield c;!U(s)||(s(a),l=a.channelToken,m()&&(o==null||o.location.assign(a.url)),i=this.utils.createJsonRpcRequestPayload("farcaster_show_QR",[{data:C({showUI:e},a)}]),r=this.request(i))}),u===E.DONE&&h(this,null,function*(){let{data:a}=yield f;a.state==="completed"&&(this.createIntermediaryEvent(S.SuccessSignIn,i.id)({channel_token:l,message:a.message,signature:a.signature,fid:a.fid,username:a.username}),yield r,D(s)&&(o==null||o.close(),s(a)))}),u===E.ERROR&&f.catch(a=>{o==null||o.close(),s(a)}),p)};return p}}};export{b as FarcasterExtension};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/es/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts", "../../src/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { Extension, FarcasterLoginEventEmit, JsonRpcRequestPayload } from '@magic-sdk/commons';\nimport type {\n CreateChannelAPIResponse,\n AuthenticateAPIResponse,\n WatchStatusResponse,\n AuthClientError,\n} from '@farcaster/auth-client';\nimport { createAppClient, viemConnector } from '@farcaster/auth-client';\nimport { FarcasterPayloadMethod } from './types';\nimport { isMobile } from './utils';\n\ntype Handle = {\n on: Handler;\n};\n\nconst EVENT = {\n CHANNEL: 'channel',\n DONE: 'done',\n ERROR: 'error',\n} as const;\n\ntype ChannelCallback = (params: CreateChannelAPIResponse) => void;\ntype DoneCallback = (params: AuthenticateAPIResponse) => void;\ntype ErrorCallback = (params: AuthClientError) => void;\n\nconst isChannelCallback = (callback: Function): callback is ChannelCallback => typeof callback === 'function';\nconst isDoneCallback = (callback: Function): callback is DoneCallback => typeof callback === 'function';\n\ninterface Handler {\n (event: 'channel', callback: ChannelCallback): Handle;\n (event: 'done', callback: DoneCallback): Handle;\n (event: 'error', callback: ErrorCallback): Handle;\n}\n\nconst DEFAULT_RELAY_URL = 'https://relay.farcaster.xyz';\nconst DEFAULT_SIWE_URI = 'https://example.com/login';\nconst DEFAULT_TIMEOUT = 60000;\nconst DEFAULT_INTERVAL = 500;\n\nexport class FarcasterExtension extends Extension.Internal<'farcaster'> {\n name = 'farcaster' as const;\n config = {};\n\n public login = ({ showUI }: { showUI: boolean }): Handle => {\n const appClient = createAppClient({\n relay: DEFAULT_RELAY_URL,\n ethereum: viemConnector(),\n });\n\n const channelPromise = appClient.createChannel({\n siweUri: DEFAULT_SIWE_URI,\n domain: window.location.host,\n });\n\n const statusPromise: WatchStatusResponse = channelPromise.then(({ data }) => {\n return appClient\n .watchStatus({\n channelToken: data.channelToken,\n timeout: DEFAULT_TIMEOUT,\n interval: DEFAULT_INTERVAL,\n })\n .then((r) => {\n if (r.isError) {\n throw r.error;\n } else {\n return r;\n }\n });\n });\n\n let requestPayload: JsonRpcRequestPayload;\n let channel_token: string;\n\n const handle: Handle = {\n on: (event, callback) => {\n if (event === 'channel') {\n (async () => {\n const { data } = await channelPromise;\n\n if (!isChannelCallback(callback)) return;\n\n callback(data);\n\n channel_token = data.channelToken;\n\n if (isMobile()) {\n
|
|
5
|
-
"mappings": "siBAAA,OAAS,aAAAA,EAAW,2BAAAC,MAAsD,qBAO1E,OAAS,mBAAAC,EAAiB,iBAAAC,MAAqB,yBCLxC,SAASC,GAAqB,CACnC,OAAO,OAAO,WAAc,aAAe,WAAW,KAAK,UAAU,SAAS,CAChF,CAEO,SAASC,GAAsB,CACpC,OAAO,OAAO,WAAc,aAAe,cAAc,KAAK,UAAU,SAAS,CACnF,CAEO,SAASC,GAAsB,CACpC,OACE,OAAO,WAAc,cACpB,OAAO,KAAK,UAAU,SAAS,GAAM,UAAU,WAAa,YAAc,UAAU,eAAiB,EAE1G,CAEO,SAASC,GAAiB,CAC/B,OAAOF,EAAW,GAAKC,EAAW,CACpC,CAEO,SAASE,GAAoB,CAClC,OAAOJ,EAAU,GAAKG,EAAM,CAC9B,CDRA,IAAME,EAAQ,CACZ,QAAS,UACT,KAAM,OACN,MAAO,OACT,EAMMC,EAAqBC,GAAoD,OAAOA,GAAa,WAC7FC,EAAkBD,GAAiD,OAAOA,GAAa,WAQvFE,EAAoB,8BACpBC,EAAmB,4BACnBC,EAAkB,IAClBC,EAAmB,IAEZC,EAAN,cAAiCC,EAAU,QAAsB,CAAjE,kCACL,UAAO,YACP,YAAS,CAAC,EAEV,KAAO,MAAQ,CAAC,CAAE,OAAAC,CAAO,IAAmC,CAC1D,IAAMC,EAAYC,EAAgB,CAChC,MAAOR,EACP,SAAUS,EAAc,CAC1B,CAAC,EAEKC,EAAiBH,EAAU,cAAc,CAC7C,QAASN,EACT,OAAQ,OAAO,SAAS,IAC1B,CAAC,EAEKU,EAAqCD,EAAe,KAAK,CAAC,CAAE,KAAAE,CAAK,IAC9DL,EACJ,YAAY,CACX,aAAcK,EAAK,aACnB,QAASV,EACT,SAAUC,CACZ,CAAC,EACA,KAAMU,GAAM,CACX,GAAIA,EAAE,QACJ,MAAMA,EAAE,MAER,OAAOA,CAEX,CAAC,CACJ,EAEGC,EACAC,
|
|
6
|
-
"names": ["Extension", "FarcasterLoginEventEmit", "createAppClient", "viemConnector", "isAndroid", "isSmallIOS", "isLargeIOS", "isIOS", "isMobile", "EVENT", "isChannelCallback", "callback", "isDoneCallback", "DEFAULT_RELAY_URL", "DEFAULT_SIWE_URI", "DEFAULT_TIMEOUT", "DEFAULT_INTERVAL", "FarcasterExtension", "Extension", "showUI", "appClient", "createAppClient", "viemConnector", "channelPromise", "statusPromise", "data", "r", "requestPayload", "channel_token", "
|
|
4
|
+
"sourcesContent": ["import { Extension, FarcasterLoginEventEmit, JsonRpcRequestPayload } from '@magic-sdk/commons';\nimport type {\n CreateChannelAPIResponse,\n AuthenticateAPIResponse,\n WatchStatusResponse,\n AuthClientError,\n} from '@farcaster/auth-client';\nimport { createAppClient, viemConnector } from '@farcaster/auth-client';\nimport { FarcasterPayloadMethod } from './types';\nimport { isMobile } from './utils';\n\ntype Handle = {\n on: Handler;\n};\n\nconst EVENT = {\n CHANNEL: 'channel',\n DONE: 'done',\n ERROR: 'error',\n} as const;\n\ntype ChannelCallback = (params: CreateChannelAPIResponse) => void;\ntype DoneCallback = (params: AuthenticateAPIResponse) => void;\ntype ErrorCallback = (params: AuthClientError) => void;\n\nconst isChannelCallback = (callback: Function): callback is ChannelCallback => typeof callback === 'function';\nconst isDoneCallback = (callback: Function): callback is DoneCallback => typeof callback === 'function';\n\ninterface Handler {\n (event: 'channel', callback: ChannelCallback): Handle;\n (event: 'done', callback: DoneCallback): Handle;\n (event: 'error', callback: ErrorCallback): Handle;\n}\n\nconst DEFAULT_RELAY_URL = 'https://relay.farcaster.xyz';\nconst DEFAULT_SIWE_URI = 'https://example.com/login';\nconst DEFAULT_TIMEOUT = 60000;\nconst DEFAULT_INTERVAL = 500;\n\nexport class FarcasterExtension extends Extension.Internal<'farcaster'> {\n name = 'farcaster' as const;\n config = {};\n\n public login = ({ showUI }: { showUI: boolean }): Handle => {\n const appClient = createAppClient({\n relay: DEFAULT_RELAY_URL,\n ethereum: viemConnector(),\n });\n\n const channelPromise = appClient.createChannel({\n siweUri: DEFAULT_SIWE_URI,\n domain: window.location.host,\n });\n\n const statusPromise: WatchStatusResponse = channelPromise.then(({ data }) => {\n return appClient\n .watchStatus({\n channelToken: data.channelToken,\n timeout: DEFAULT_TIMEOUT,\n interval: DEFAULT_INTERVAL,\n })\n .then((r) => {\n if (r.isError) {\n throw r.error;\n } else {\n return r;\n }\n });\n });\n\n let popup: Window | null = null;\n let requestPayload: JsonRpcRequestPayload;\n let rpcPromise: Promise<void> | null;\n let channel_token: string;\n\n if (isMobile()) {\n console.info('Info: showUI parameter is ignored on mobile, open URL directly');\n popup = window.open();\n }\n\n const handle: Handle = {\n on: (event, callback) => {\n if (event === 'channel') {\n (async () => {\n const { data } = await channelPromise;\n\n if (!isChannelCallback(callback)) return;\n\n callback(data);\n\n channel_token = data.channelToken;\n\n if (isMobile()) {\n popup?.location.assign(data.url);\n }\n\n requestPayload = this.utils.createJsonRpcRequestPayload(FarcasterPayloadMethod.FarcasterShowQR, [\n { data: { showUI, ...data } },\n ]);\n\n rpcPromise = this.request(requestPayload);\n })();\n }\n if (event === EVENT.DONE) {\n (async () => {\n const { data } = await statusPromise;\n\n if (data.state !== 'completed') return;\n\n this.createIntermediaryEvent(\n FarcasterLoginEventEmit.SuccessSignIn,\n requestPayload.id as string,\n )({\n channel_token,\n message: data.message,\n signature: data.signature,\n fid: data.fid,\n username: data.username,\n });\n\n await rpcPromise;\n\n if (!isDoneCallback(callback)) return;\n\n popup?.close();\n\n callback(data);\n })();\n }\n if (event === EVENT.ERROR) {\n statusPromise.catch((e) => {\n popup?.close();\n callback(e);\n });\n }\n\n return handle;\n },\n };\n\n return handle;\n };\n}\n", "// https://github.com/farcasterxyz/auth-monorepo/blob/main/packages/auth-kit/src/utils.ts\n\nexport function isAndroid(): boolean {\n return typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent);\n}\n\nexport function isSmallIOS(): boolean {\n return typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent);\n}\n\nexport function isLargeIOS(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n (/iPad/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1))\n );\n}\n\nexport function isIOS(): boolean {\n return isSmallIOS() || isLargeIOS();\n}\n\nexport function isMobile(): boolean {\n return isAndroid() || isIOS();\n}\n"],
|
|
5
|
+
"mappings": "siBAAA,OAAS,aAAAA,EAAW,2BAAAC,MAAsD,qBAO1E,OAAS,mBAAAC,EAAiB,iBAAAC,MAAqB,yBCLxC,SAASC,GAAqB,CACnC,OAAO,OAAO,WAAc,aAAe,WAAW,KAAK,UAAU,SAAS,CAChF,CAEO,SAASC,GAAsB,CACpC,OAAO,OAAO,WAAc,aAAe,cAAc,KAAK,UAAU,SAAS,CACnF,CAEO,SAASC,GAAsB,CACpC,OACE,OAAO,WAAc,cACpB,OAAO,KAAK,UAAU,SAAS,GAAM,UAAU,WAAa,YAAc,UAAU,eAAiB,EAE1G,CAEO,SAASC,GAAiB,CAC/B,OAAOF,EAAW,GAAKC,EAAW,CACpC,CAEO,SAASE,GAAoB,CAClC,OAAOJ,EAAU,GAAKG,EAAM,CAC9B,CDRA,IAAME,EAAQ,CACZ,QAAS,UACT,KAAM,OACN,MAAO,OACT,EAMMC,EAAqBC,GAAoD,OAAOA,GAAa,WAC7FC,EAAkBD,GAAiD,OAAOA,GAAa,WAQvFE,EAAoB,8BACpBC,EAAmB,4BACnBC,EAAkB,IAClBC,EAAmB,IAEZC,EAAN,cAAiCC,EAAU,QAAsB,CAAjE,kCACL,UAAO,YACP,YAAS,CAAC,EAEV,KAAO,MAAQ,CAAC,CAAE,OAAAC,CAAO,IAAmC,CAC1D,IAAMC,EAAYC,EAAgB,CAChC,MAAOR,EACP,SAAUS,EAAc,CAC1B,CAAC,EAEKC,EAAiBH,EAAU,cAAc,CAC7C,QAASN,EACT,OAAQ,OAAO,SAAS,IAC1B,CAAC,EAEKU,EAAqCD,EAAe,KAAK,CAAC,CAAE,KAAAE,CAAK,IAC9DL,EACJ,YAAY,CACX,aAAcK,EAAK,aACnB,QAASV,EACT,SAAUC,CACZ,CAAC,EACA,KAAMU,GAAM,CACX,GAAIA,EAAE,QACJ,MAAMA,EAAE,MAER,OAAOA,CAEX,CAAC,CACJ,EAEGC,EAAuB,KACvBC,EACAC,EACAC,EAEAC,EAAS,IACX,QAAQ,KAAK,gEAAgE,EAC7EJ,EAAQ,OAAO,KAAK,GAGtB,IAAMK,EAAiB,CACrB,GAAI,CAACC,EAAOtB,KACNsB,IAAU,WACCC,EAAA,sBACX,GAAM,CAAE,KAAAT,CAAK,EAAI,MAAMF,EAEnB,CAACb,EAAkBC,CAAQ,IAE/BA,EAASc,CAAI,EAEbK,EAAgBL,EAAK,aAEjBM,EAAS,IACXJ,GAAA,MAAAA,EAAO,SAAS,OAAOF,EAAK,MAG9BG,EAAiB,KAAK,MAAM,gDAAoE,CAC9F,CAAE,KAAMO,EAAA,CAAE,OAAAhB,GAAWM,EAAO,CAC9B,CAAC,EAEDI,EAAa,KAAK,QAAQD,CAAc,EAC1C,GAEEK,IAAUxB,EAAM,MACLyB,EAAA,sBACX,GAAM,CAAE,KAAAT,CAAK,EAAI,MAAMD,EAEnBC,EAAK,QAAU,cAEnB,KAAK,wBACHW,EAAwB,cACxBR,EAAe,EACjB,EAAE,CACA,cAAAE,EACA,QAASL,EAAK,QACd,UAAWA,EAAK,UAChB,IAAKA,EAAK,IACV,SAAUA,EAAK,QACjB,CAAC,EAED,MAAMI,EAEDjB,EAAeD,CAAQ,IAE5BgB,GAAA,MAAAA,EAAO,QAEPhB,EAASc,CAAI,GACf,GAEEQ,IAAUxB,EAAM,OAClBe,EAAc,MAAOa,GAAM,CACzBV,GAAA,MAAAA,EAAO,QACPhB,EAAS0B,CAAC,CACZ,CAAC,EAGIL,EAEX,EAEA,OAAOA,CACT,EACF",
|
|
6
|
+
"names": ["Extension", "FarcasterLoginEventEmit", "createAppClient", "viemConnector", "isAndroid", "isSmallIOS", "isLargeIOS", "isIOS", "isMobile", "EVENT", "isChannelCallback", "callback", "isDoneCallback", "DEFAULT_RELAY_URL", "DEFAULT_SIWE_URI", "DEFAULT_TIMEOUT", "DEFAULT_INTERVAL", "FarcasterExtension", "Extension", "showUI", "appClient", "createAppClient", "viemConnector", "channelPromise", "statusPromise", "data", "r", "popup", "requestPayload", "rpcPromise", "channel_token", "isMobile", "handle", "event", "__async", "__spreadValues", "FarcasterLoginEventEmit", "e"]
|
|
7
7
|
}
|
package/dist/es/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var y=Object.defineProperty;var g=Object.getOwnPropertySymbols;var A=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var R=(n,t,e)=>t in n?y(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,C=(n,t)=>{for(var e in t||(t={}))A.call(t,e)&&R(n,e,t[e]);if(g)for(var e of g(t))I.call(t,e)&&R(n,e,t[e]);return n};var h=(n,t,e)=>new Promise((d,c)=>{var f=r=>{try{i(e.next(r))}catch(l){c(l)}},o=r=>{try{i(e.throw(r))}catch(l){c(l)}},i=r=>r.done?d(r.value):Promise.resolve(r.value).then(f,o);i((e=e.apply(n,t)).next())});import{Extension as L,FarcasterLoginEventEmit as S}from"@magic-sdk/commons";import{createAppClient as T,viemConnector as x}from"@farcaster/auth-client";function v(){return typeof navigator!="undefined"&&/android/i.test(navigator.userAgent)}function w(){return typeof navigator!="undefined"&&/iPhone|iPod/.test(navigator.userAgent)}function k(){return typeof navigator!="undefined"&&(/iPad/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)}function P(){return w()||k()}function m(){return v()||P()}var E={CHANNEL:"channel",DONE:"done",ERROR:"error"},U=n=>typeof n=="function",D=n=>typeof n=="function",_="https://relay.farcaster.xyz",H="https://example.com/login",F=6e4,O=500,b=class extends L.Internal{constructor(){super(...arguments);this.name="farcaster";this.config={};this.login=({showUI:e})=>{let d=T({relay:_,ethereum:x()}),c=d.createChannel({siweUri:H,domain:window.location.host}),f=c.then(({data:u})=>d.watchStatus({channelToken:u.channelToken,timeout:F,interval:O}).then(s=>{if(s.isError)throw s.error;return s})),o=null,i,r,l;m()&&(console.info("Info: showUI parameter is ignored on mobile, open URL directly"),o=window.open());let p={on:(u,s)=>(u==="channel"&&h(this,null,function*(){let{data:a}=yield c;!U(s)||(s(a),l=a.channelToken,m()&&(o==null||o.location.assign(a.url)),i=this.utils.createJsonRpcRequestPayload("farcaster_show_QR",[{data:C({showUI:e},a)}]),r=this.request(i))}),u===E.DONE&&h(this,null,function*(){let{data:a}=yield f;a.state==="completed"&&(this.createIntermediaryEvent(S.SuccessSignIn,i.id)({channel_token:l,message:a.message,signature:a.signature,fid:a.fid,username:a.username}),yield r,D(s)&&(o==null||o.close(),s(a)))}),u===E.ERROR&&f.catch(a=>{o==null||o.close(),s(a)}),p)};return p}}};export{b as FarcasterExtension};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/es/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts", "../../src/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { Extension, FarcasterLoginEventEmit, JsonRpcRequestPayload } from '@magic-sdk/commons';\nimport type {\n CreateChannelAPIResponse,\n AuthenticateAPIResponse,\n WatchStatusResponse,\n AuthClientError,\n} from '@farcaster/auth-client';\nimport { createAppClient, viemConnector } from '@farcaster/auth-client';\nimport { FarcasterPayloadMethod } from './types';\nimport { isMobile } from './utils';\n\ntype Handle = {\n on: Handler;\n};\n\nconst EVENT = {\n CHANNEL: 'channel',\n DONE: 'done',\n ERROR: 'error',\n} as const;\n\ntype ChannelCallback = (params: CreateChannelAPIResponse) => void;\ntype DoneCallback = (params: AuthenticateAPIResponse) => void;\ntype ErrorCallback = (params: AuthClientError) => void;\n\nconst isChannelCallback = (callback: Function): callback is ChannelCallback => typeof callback === 'function';\nconst isDoneCallback = (callback: Function): callback is DoneCallback => typeof callback === 'function';\n\ninterface Handler {\n (event: 'channel', callback: ChannelCallback): Handle;\n (event: 'done', callback: DoneCallback): Handle;\n (event: 'error', callback: ErrorCallback): Handle;\n}\n\nconst DEFAULT_RELAY_URL = 'https://relay.farcaster.xyz';\nconst DEFAULT_SIWE_URI = 'https://example.com/login';\nconst DEFAULT_TIMEOUT = 60000;\nconst DEFAULT_INTERVAL = 500;\n\nexport class FarcasterExtension extends Extension.Internal<'farcaster'> {\n name = 'farcaster' as const;\n config = {};\n\n public login = ({ showUI }: { showUI: boolean }): Handle => {\n const appClient = createAppClient({\n relay: DEFAULT_RELAY_URL,\n ethereum: viemConnector(),\n });\n\n const channelPromise = appClient.createChannel({\n siweUri: DEFAULT_SIWE_URI,\n domain: window.location.host,\n });\n\n const statusPromise: WatchStatusResponse = channelPromise.then(({ data }) => {\n return appClient\n .watchStatus({\n channelToken: data.channelToken,\n timeout: DEFAULT_TIMEOUT,\n interval: DEFAULT_INTERVAL,\n })\n .then((r) => {\n if (r.isError) {\n throw r.error;\n } else {\n return r;\n }\n });\n });\n\n let requestPayload: JsonRpcRequestPayload;\n let channel_token: string;\n\n const handle: Handle = {\n on: (event, callback) => {\n if (event === 'channel') {\n (async () => {\n const { data } = await channelPromise;\n\n if (!isChannelCallback(callback)) return;\n\n callback(data);\n\n channel_token = data.channelToken;\n\n if (isMobile()) {\n
|
|
5
|
-
"mappings": "siBAAA,OAAS,aAAAA,EAAW,2BAAAC,MAAsD,qBAO1E,OAAS,mBAAAC,EAAiB,iBAAAC,MAAqB,yBCLxC,SAASC,GAAqB,CACnC,OAAO,OAAO,WAAc,aAAe,WAAW,KAAK,UAAU,SAAS,CAChF,CAEO,SAASC,GAAsB,CACpC,OAAO,OAAO,WAAc,aAAe,cAAc,KAAK,UAAU,SAAS,CACnF,CAEO,SAASC,GAAsB,CACpC,OACE,OAAO,WAAc,cACpB,OAAO,KAAK,UAAU,SAAS,GAAM,UAAU,WAAa,YAAc,UAAU,eAAiB,EAE1G,CAEO,SAASC,GAAiB,CAC/B,OAAOF,EAAW,GAAKC,EAAW,CACpC,CAEO,SAASE,GAAoB,CAClC,OAAOJ,EAAU,GAAKG,EAAM,CAC9B,CDRA,IAAME,EAAQ,CACZ,QAAS,UACT,KAAM,OACN,MAAO,OACT,EAMMC,EAAqBC,GAAoD,OAAOA,GAAa,WAC7FC,EAAkBD,GAAiD,OAAOA,GAAa,WAQvFE,EAAoB,8BACpBC,EAAmB,4BACnBC,EAAkB,IAClBC,EAAmB,IAEZC,EAAN,cAAiCC,EAAU,QAAsB,CAAjE,kCACL,UAAO,YACP,YAAS,CAAC,EAEV,KAAO,MAAQ,CAAC,CAAE,OAAAC,CAAO,IAAmC,CAC1D,IAAMC,EAAYC,EAAgB,CAChC,MAAOR,EACP,SAAUS,EAAc,CAC1B,CAAC,EAEKC,EAAiBH,EAAU,cAAc,CAC7C,QAASN,EACT,OAAQ,OAAO,SAAS,IAC1B,CAAC,EAEKU,EAAqCD,EAAe,KAAK,CAAC,CAAE,KAAAE,CAAK,IAC9DL,EACJ,YAAY,CACX,aAAcK,EAAK,aACnB,QAASV,EACT,SAAUC,CACZ,CAAC,EACA,KAAMU,GAAM,CACX,GAAIA,EAAE,QACJ,MAAMA,EAAE,MAER,OAAOA,CAEX,CAAC,CACJ,EAEGC,EACAC,
|
|
6
|
-
"names": ["Extension", "FarcasterLoginEventEmit", "createAppClient", "viemConnector", "isAndroid", "isSmallIOS", "isLargeIOS", "isIOS", "isMobile", "EVENT", "isChannelCallback", "callback", "isDoneCallback", "DEFAULT_RELAY_URL", "DEFAULT_SIWE_URI", "DEFAULT_TIMEOUT", "DEFAULT_INTERVAL", "FarcasterExtension", "Extension", "showUI", "appClient", "createAppClient", "viemConnector", "channelPromise", "statusPromise", "data", "r", "requestPayload", "channel_token", "
|
|
4
|
+
"sourcesContent": ["import { Extension, FarcasterLoginEventEmit, JsonRpcRequestPayload } from '@magic-sdk/commons';\nimport type {\n CreateChannelAPIResponse,\n AuthenticateAPIResponse,\n WatchStatusResponse,\n AuthClientError,\n} from '@farcaster/auth-client';\nimport { createAppClient, viemConnector } from '@farcaster/auth-client';\nimport { FarcasterPayloadMethod } from './types';\nimport { isMobile } from './utils';\n\ntype Handle = {\n on: Handler;\n};\n\nconst EVENT = {\n CHANNEL: 'channel',\n DONE: 'done',\n ERROR: 'error',\n} as const;\n\ntype ChannelCallback = (params: CreateChannelAPIResponse) => void;\ntype DoneCallback = (params: AuthenticateAPIResponse) => void;\ntype ErrorCallback = (params: AuthClientError) => void;\n\nconst isChannelCallback = (callback: Function): callback is ChannelCallback => typeof callback === 'function';\nconst isDoneCallback = (callback: Function): callback is DoneCallback => typeof callback === 'function';\n\ninterface Handler {\n (event: 'channel', callback: ChannelCallback): Handle;\n (event: 'done', callback: DoneCallback): Handle;\n (event: 'error', callback: ErrorCallback): Handle;\n}\n\nconst DEFAULT_RELAY_URL = 'https://relay.farcaster.xyz';\nconst DEFAULT_SIWE_URI = 'https://example.com/login';\nconst DEFAULT_TIMEOUT = 60000;\nconst DEFAULT_INTERVAL = 500;\n\nexport class FarcasterExtension extends Extension.Internal<'farcaster'> {\n name = 'farcaster' as const;\n config = {};\n\n public login = ({ showUI }: { showUI: boolean }): Handle => {\n const appClient = createAppClient({\n relay: DEFAULT_RELAY_URL,\n ethereum: viemConnector(),\n });\n\n const channelPromise = appClient.createChannel({\n siweUri: DEFAULT_SIWE_URI,\n domain: window.location.host,\n });\n\n const statusPromise: WatchStatusResponse = channelPromise.then(({ data }) => {\n return appClient\n .watchStatus({\n channelToken: data.channelToken,\n timeout: DEFAULT_TIMEOUT,\n interval: DEFAULT_INTERVAL,\n })\n .then((r) => {\n if (r.isError) {\n throw r.error;\n } else {\n return r;\n }\n });\n });\n\n let popup: Window | null = null;\n let requestPayload: JsonRpcRequestPayload;\n let rpcPromise: Promise<void> | null;\n let channel_token: string;\n\n if (isMobile()) {\n console.info('Info: showUI parameter is ignored on mobile, open URL directly');\n popup = window.open();\n }\n\n const handle: Handle = {\n on: (event, callback) => {\n if (event === 'channel') {\n (async () => {\n const { data } = await channelPromise;\n\n if (!isChannelCallback(callback)) return;\n\n callback(data);\n\n channel_token = data.channelToken;\n\n if (isMobile()) {\n popup?.location.assign(data.url);\n }\n\n requestPayload = this.utils.createJsonRpcRequestPayload(FarcasterPayloadMethod.FarcasterShowQR, [\n { data: { showUI, ...data } },\n ]);\n\n rpcPromise = this.request(requestPayload);\n })();\n }\n if (event === EVENT.DONE) {\n (async () => {\n const { data } = await statusPromise;\n\n if (data.state !== 'completed') return;\n\n this.createIntermediaryEvent(\n FarcasterLoginEventEmit.SuccessSignIn,\n requestPayload.id as string,\n )({\n channel_token,\n message: data.message,\n signature: data.signature,\n fid: data.fid,\n username: data.username,\n });\n\n await rpcPromise;\n\n if (!isDoneCallback(callback)) return;\n\n popup?.close();\n\n callback(data);\n })();\n }\n if (event === EVENT.ERROR) {\n statusPromise.catch((e) => {\n popup?.close();\n callback(e);\n });\n }\n\n return handle;\n },\n };\n\n return handle;\n };\n}\n", "// https://github.com/farcasterxyz/auth-monorepo/blob/main/packages/auth-kit/src/utils.ts\n\nexport function isAndroid(): boolean {\n return typeof navigator !== 'undefined' && /android/i.test(navigator.userAgent);\n}\n\nexport function isSmallIOS(): boolean {\n return typeof navigator !== 'undefined' && /iPhone|iPod/.test(navigator.userAgent);\n}\n\nexport function isLargeIOS(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n (/iPad/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1))\n );\n}\n\nexport function isIOS(): boolean {\n return isSmallIOS() || isLargeIOS();\n}\n\nexport function isMobile(): boolean {\n return isAndroid() || isIOS();\n}\n"],
|
|
5
|
+
"mappings": "siBAAA,OAAS,aAAAA,EAAW,2BAAAC,MAAsD,qBAO1E,OAAS,mBAAAC,EAAiB,iBAAAC,MAAqB,yBCLxC,SAASC,GAAqB,CACnC,OAAO,OAAO,WAAc,aAAe,WAAW,KAAK,UAAU,SAAS,CAChF,CAEO,SAASC,GAAsB,CACpC,OAAO,OAAO,WAAc,aAAe,cAAc,KAAK,UAAU,SAAS,CACnF,CAEO,SAASC,GAAsB,CACpC,OACE,OAAO,WAAc,cACpB,OAAO,KAAK,UAAU,SAAS,GAAM,UAAU,WAAa,YAAc,UAAU,eAAiB,EAE1G,CAEO,SAASC,GAAiB,CAC/B,OAAOF,EAAW,GAAKC,EAAW,CACpC,CAEO,SAASE,GAAoB,CAClC,OAAOJ,EAAU,GAAKG,EAAM,CAC9B,CDRA,IAAME,EAAQ,CACZ,QAAS,UACT,KAAM,OACN,MAAO,OACT,EAMMC,EAAqBC,GAAoD,OAAOA,GAAa,WAC7FC,EAAkBD,GAAiD,OAAOA,GAAa,WAQvFE,EAAoB,8BACpBC,EAAmB,4BACnBC,EAAkB,IAClBC,EAAmB,IAEZC,EAAN,cAAiCC,EAAU,QAAsB,CAAjE,kCACL,UAAO,YACP,YAAS,CAAC,EAEV,KAAO,MAAQ,CAAC,CAAE,OAAAC,CAAO,IAAmC,CAC1D,IAAMC,EAAYC,EAAgB,CAChC,MAAOR,EACP,SAAUS,EAAc,CAC1B,CAAC,EAEKC,EAAiBH,EAAU,cAAc,CAC7C,QAASN,EACT,OAAQ,OAAO,SAAS,IAC1B,CAAC,EAEKU,EAAqCD,EAAe,KAAK,CAAC,CAAE,KAAAE,CAAK,IAC9DL,EACJ,YAAY,CACX,aAAcK,EAAK,aACnB,QAASV,EACT,SAAUC,CACZ,CAAC,EACA,KAAMU,GAAM,CACX,GAAIA,EAAE,QACJ,MAAMA,EAAE,MAER,OAAOA,CAEX,CAAC,CACJ,EAEGC,EAAuB,KACvBC,EACAC,EACAC,EAEAC,EAAS,IACX,QAAQ,KAAK,gEAAgE,EAC7EJ,EAAQ,OAAO,KAAK,GAGtB,IAAMK,EAAiB,CACrB,GAAI,CAACC,EAAOtB,KACNsB,IAAU,WACCC,EAAA,sBACX,GAAM,CAAE,KAAAT,CAAK,EAAI,MAAMF,EAEnB,CAACb,EAAkBC,CAAQ,IAE/BA,EAASc,CAAI,EAEbK,EAAgBL,EAAK,aAEjBM,EAAS,IACXJ,GAAA,MAAAA,EAAO,SAAS,OAAOF,EAAK,MAG9BG,EAAiB,KAAK,MAAM,gDAAoE,CAC9F,CAAE,KAAMO,EAAA,CAAE,OAAAhB,GAAWM,EAAO,CAC9B,CAAC,EAEDI,EAAa,KAAK,QAAQD,CAAc,EAC1C,GAEEK,IAAUxB,EAAM,MACLyB,EAAA,sBACX,GAAM,CAAE,KAAAT,CAAK,EAAI,MAAMD,EAEnBC,EAAK,QAAU,cAEnB,KAAK,wBACHW,EAAwB,cACxBR,EAAe,EACjB,EAAE,CACA,cAAAE,EACA,QAASL,EAAK,QACd,UAAWA,EAAK,UAChB,IAAKA,EAAK,IACV,SAAUA,EAAK,QACjB,CAAC,EAED,MAAMI,EAEDjB,EAAeD,CAAQ,IAE5BgB,GAAA,MAAAA,EAAO,QAEPhB,EAASc,CAAI,GACf,GAEEQ,IAAUxB,EAAM,OAClBe,EAAc,MAAOa,GAAM,CACzBV,GAAA,MAAAA,EAAO,QACPhB,EAAS0B,CAAC,CACZ,CAAC,EAGIL,EAEX,EAEA,OAAOA,CACT,EACF",
|
|
6
|
+
"names": ["Extension", "FarcasterLoginEventEmit", "createAppClient", "viemConnector", "isAndroid", "isSmallIOS", "isLargeIOS", "isIOS", "isMobile", "EVENT", "isChannelCallback", "callback", "isDoneCallback", "DEFAULT_RELAY_URL", "DEFAULT_SIWE_URI", "DEFAULT_TIMEOUT", "DEFAULT_INTERVAL", "FarcasterExtension", "Extension", "showUI", "appClient", "createAppClient", "viemConnector", "channelPromise", "statusPromise", "data", "r", "popup", "requestPayload", "rpcPromise", "channel_token", "isMobile", "handle", "event", "__async", "__spreadValues", "FarcasterLoginEventEmit", "e"]
|
|
7
7
|
}
|