diff --git a/package.json b/package.json index 789ca78..601fff8 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ } ], "devDependencies": { - "@cloudflare/workers-types": "^4.20231121.0", + "@cloudflare/workers-types": "^4.20240117.0", "@ensdomains/ens-contracts": "^0.0.21", "@types/chai": "^4.3.4", "@types/chai-as-promised": "^7.1.5", @@ -76,6 +76,7 @@ "@chainlink/ccip-read-server": "^0.2.1", "@ensdomains/ccip-read-cf-worker": "^0.0.3", "@ensdomains/dnsprovejs": "^0.4.1", + "@ensdomains/server-analytics": "^0.0.1-alpha.2", "dotenv": "^16.0.3", "ethers": "^5.7.2", "node-fetch": "2.6.1" diff --git a/src/utils/analytics.ts b/src/utils/analytics.ts deleted file mode 100644 index 70e1097..0000000 --- a/src/utils/analytics.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Request as CFWRequest } from '@cloudflare/workers-types'; -import { Request as ExpressRequest } from 'express'; - -interface TrackerOptions { - apiEndpoint?: string; - enableLogging?: boolean; -} - -interface TrackingOptions { - props?: { [key: string]: number | string } | string | number; - data?: { [key: string]: number | string } | string | number; -} - -interface RequestBody { - domain: string; - name: string; - url: string; - referrer?: string; - props?: { [key: string]: number | string } | string | number; - data?: { [key: string]: number | string } | string | number; -} - -export class Tracker { - domain = ''; - enableLogging = false; - apiEndpoint = 'https://plausible.io/api/event'; - - constructor(domain: string, options: TrackerOptions = {}) { - this.domain = domain; - this.apiEndpoint = options.apiEndpoint || this.apiEndpoint; - this.enableLogging = options.enableLogging || this.enableLogging; - } - - log(message: string) { - if (this.enableLogging) { - console.log(message); - } - } - - async trackPageview( - req: CFWRequest | ExpressRequest, - options?: TrackingOptions, - includeUserDetails?: boolean - ) { - await this.trackEvent(req, 'pageview', options, includeUserDetails); - } - - async trackEvent( - req: CFWRequest | ExpressRequest, - name: string, - { props, data }: TrackingOptions = {}, - includeUserDetails = false - ) { - try { - if (!name || typeof name !== 'string') { - throw new Error('Invalid event name'); - } - - const body: RequestBody = { - domain: this.domain, - name: name, - url: - 'originalUrl' in req // means it's express request - ? `${req.protocol}://${req.get('host')}${req.originalUrl}` - : req.url, - }; - - const requestInfo = 'originalUrl' in req ? req : req.headers; - - if (requestInfo.get('Referrer')) { - body.referrer = requestInfo.get('Referrer') || ''; - } - - if (props) { - body.props = props; - } - - if (data) { - body.data = data; - } - - const headers: HeadersInit = { - 'Content-Type': 'application/json', - }; - - const userAgent = requestInfo.get('User-Agent'); - if (userAgent) { - headers['User-Agent'] = userAgent; - headers['X-Forwarded-For'] = '127.0.0.1'; - } - - if (includeUserDetails) { - headers['X-Forwarded-For'] = - (requestInfo as ExpressRequest)?.socket?.remoteAddress || - requestInfo.get('CF-Connecting-IP') || - ''; - } - - this.log(JSON.stringify(headers)); - this.log(JSON.stringify(body)); - - const response = await fetch(this.apiEndpoint, { - method: 'POST', - headers: headers, - body: JSON.stringify(body), - }); - - if (!response.ok) { - throw new Error(`Plausible API responded with ${response.status}`); - } - - this.log(`Event tracked: ${name}`); - } catch (err) { - console.error('Plausible error:', err); - } - } -} diff --git a/src/worker.ts b/src/worker.ts index 310d746..cc51cea 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -3,9 +3,9 @@ import { ExecutionContext, } from '@cloudflare/workers-types'; import { Server } from '@ensdomains/ccip-read-cf-worker'; +import { Tracker } from '@ensdomains/server-analytics'; import { dohQuery } from '@ensdomains/dnsprovejs'; import { makeApp } from './app'; -import { Tracker } from './utils/analytics'; interface ENV { DOH_GATEWAY_URL: string; diff --git a/yarn.lock b/yarn.lock index fbd0775..ba1b35b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -951,10 +951,10 @@ ethers "^5.3.1" express "^4.17.1" -"@cloudflare/workers-types@^4.20231121.0": - version "4.20231121.0" - resolved "https://registry.yarnpkg.com/@cloudflare/workers-types/-/workers-types-4.20231121.0.tgz#6a1c0bfc93aca4643d43f6439cfb7aca8058f289" - integrity sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA== +"@cloudflare/workers-types@^4.20240117.0": + version "4.20240117.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workers-types/-/workers-types-4.20240117.0.tgz#6cadb53017488ea4258dfd4fb589562d3b85a597" + integrity sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A== "@cnakazawa/watch@^1.0.3": version "1.0.4" @@ -996,6 +996,14 @@ "@openzeppelin/contracts" "^4.1.0" dns-packet "^5.3.0" +"@ensdomains/server-analytics@^0.0.1-alpha.2": + version "0.0.1-alpha.2" + resolved "https://registry.yarnpkg.com/@ensdomains/server-analytics/-/server-analytics-0.0.1-alpha.2.tgz#6a7df23be69e03ebd6426fe43a48a60ed9f242b0" + integrity sha512-ewXfZzp/YGoEo4/OKBx6olT7h/P6X01EZ7B4D8ZjFTa4sLzAufQK1qnjHY+SdE6LJ/gAlJX5nl62agtPjVKUGg== + dependencies: + "@cloudflare/workers-types" "^4.20240117.0" + express "^4.18.2" + "@ensdomains/solsha1@0.0.3": version "0.0.3" resolved "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz" @@ -4208,7 +4216,7 @@ expect@^25.5.0: jest-message-util "^25.5.0" jest-regex-util "^25.2.6" -express@^4.17.1: +express@^4.17.1, express@^4.18.2: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==