@@ -54,6 +54,36 @@ export function segmentBackend(config: SegmentBackendConfig): NextlyticsBackend
5454 }
5555 }
5656
57+ function buildUrl ( event : NextlyticsEvent ) : string {
58+ // Prefer client-provided URL if available
59+ if ( event . clientContext ?. url ) return event . clientContext . url ;
60+
61+ const { host, path, search } = event . serverContext ;
62+ const protocol = host . includes ( "localhost" ) || host . match ( / ^ [ \d . : ] + $ / ) ? "http" : "https" ;
63+ const searchStr = Object . entries ( search )
64+ . flatMap ( ( [ k , vals ] ) => vals . map ( ( v ) => `${ encodeURIComponent ( k ) } =${ encodeURIComponent ( v ) } ` ) )
65+ . join ( "&" ) ;
66+ return `${ protocol } ://${ host } ${ path } ${ searchStr ? `?${ searchStr } ` : "" } ` ;
67+ }
68+
69+ function getSearchString ( event : NextlyticsEvent ) : string {
70+ // Prefer client-provided search if available
71+ if ( event . clientContext ?. search ) return event . clientContext . search ;
72+
73+ return Object . entries ( event . serverContext . search )
74+ . flatMap ( ( [ k , vals ] ) => vals . map ( ( v ) => `${ encodeURIComponent ( k ) } =${ encodeURIComponent ( v ) } ` ) )
75+ . join ( "&" ) ;
76+ }
77+
78+ function getReferringDomain ( referer ?: string ) : string | undefined {
79+ if ( ! referer ) return undefined ;
80+ try {
81+ return new URL ( referer ) . hostname ;
82+ } catch {
83+ return undefined ;
84+ }
85+ }
86+
5787 function buildContext ( event : NextlyticsEvent ) {
5888 const ctx : Record < string , unknown > = {
5989 ip : event . serverContext . ip ,
@@ -63,20 +93,29 @@ export function segmentBackend(config: SegmentBackendConfig): NextlyticsBackend
6393 ctx . traits = event . userContext . traits ;
6494 }
6595
66- if ( event . clientContext ) {
67- ctx . userAgent = event . clientContext . userAgent ;
68- ctx . locale = event . clientContext . locale ;
69- ctx . page = {
70- path : event . clientContext . path ,
71- referrer : event . clientContext . referer ,
72- } ;
73- if ( event . clientContext . screen ) {
96+ const cc = event . clientContext ;
97+ const sc = event . serverContext ;
98+
99+ ctx . page = {
100+ path : cc ?. path ?? sc . path ,
101+ referrer : cc ?. referer ,
102+ referring_domain : getReferringDomain ( cc ?. referer ) ,
103+ host : cc ?. host ?? sc . host ,
104+ search : getSearchString ( event ) ,
105+ title : cc ?. title ,
106+ url : buildUrl ( event ) ,
107+ } ;
108+
109+ if ( cc ) {
110+ ctx . userAgent = cc . userAgent ;
111+ ctx . locale = cc . locale ;
112+ if ( cc . screen ) {
74113 ctx . screen = {
75- width : event . clientContext . screen . width ,
76- height : event . clientContext . screen . height ,
77- innerWidth : event . clientContext . screen . innerWidth ,
78- innerHeight : event . clientContext . screen . innerHeight ,
79- density : event . clientContext . screen . density ,
114+ width : cc . screen . width ,
115+ height : cc . screen . height ,
116+ innerWidth : cc . screen . innerWidth ,
117+ innerHeight : cc . screen . innerHeight ,
118+ density : cc . screen . density ,
80119 } ;
81120 }
82121 }
@@ -85,12 +124,19 @@ export function segmentBackend(config: SegmentBackendConfig): NextlyticsBackend
85124 }
86125
87126 function buildProperties ( event : NextlyticsEvent ) {
127+ const cc = event . clientContext ;
128+ const sc = event . serverContext ;
129+
88130 return {
89131 parentEventId : event . parentEventId ,
90- path : event . serverContext . path ,
91- host : event . serverContext . host ,
92- method : event . serverContext . method ,
93- search : event . serverContext . search ,
132+ path : cc ?. path ?? sc . path ,
133+ url : buildUrl ( event ) ,
134+ search : getSearchString ( event ) ,
135+ hash : cc ?. hash ,
136+ title : cc ?. title ,
137+ referrer : cc ?. referer ,
138+ width : cc ?. screen ?. innerWidth ,
139+ height : cc ?. screen ?. innerHeight ,
94140 ...event . properties ,
95141 } ;
96142 }
0 commit comments