From 50c1b48537cd9a2370269cf9008f6c21b8019ae5 Mon Sep 17 00:00:00 2001 From: balazskreith Date: Fri, 3 Oct 2025 09:43:53 +0300 Subject: [PATCH 1/8] feat: add closeClientIfIdleForMs and closeCallIfEmptyForMs to ObserverConfig and ObservedCall --- src/ObservedCall.ts | 4 ++++ src/Observer.ts | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/ObservedCall.ts b/src/ObservedCall.ts index 4f651a6..79f1653 100644 --- a/src/ObservedCall.ts +++ b/src/ObservedCall.ts @@ -177,6 +177,10 @@ export class ObservedCall = Record(settings, this); const wasEmpty = this.observedClients.size === 0; const onUpdate = () => this._onClientUpdate(result); diff --git a/src/Observer.ts b/src/Observer.ts index 469c7ad..092c388 100644 --- a/src/Observer.ts +++ b/src/Observer.ts @@ -31,6 +31,8 @@ export type ObserverConfig = Record = Record this._onObservedCallUpdated(observedCall); From ca725d701f00c711bd2c0ff204743082ab48fde8 Mon Sep 17 00:00:00 2001 From: balazskreith Date: Fri, 3 Oct 2025 09:45:36 +0300 Subject: [PATCH 2/8] feat: add develop branch to push triggers in GitHub Actions workflow --- .github/workflows/publish.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 986345a..cf2f721 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -3,6 +3,7 @@ on: push: branches: - master + - develop pull_request: branches: - master From 89a79baadd20237454dbe1932aa4527d829a93c5 Mon Sep 17 00:00:00 2001 From: balazskreith Date: Mon, 15 Dec 2025 13:54:54 +0200 Subject: [PATCH 3/8] feat: implement track reporting and client reporting structures in ObservedClient and ObservedTrack classes --- src/ObservedCall.ts | 46 +--------- src/ObservedCallEventMonitor.ts | 10 +++ src/ObservedClient.ts | 146 ++++++++++++++++++++++---------- src/ObservedInboundTrack.ts | 29 ++++++- src/ObservedOutboundTrack.ts | 8 ++ src/ObservedPeerConnection.ts | 22 ++++- src/Observer.ts | 11 +-- src/Reports.ts | 71 ++++++++++++++++ 8 files changed, 240 insertions(+), 103 deletions(-) create mode 100644 src/Reports.ts diff --git a/src/ObservedCall.ts b/src/ObservedCall.ts index 79f1653..484ffb4 100644 --- a/src/ObservedCall.ts +++ b/src/ObservedCall.ts @@ -52,21 +52,6 @@ export class ObservedCall = Record = Record = Record { @@ -122,6 +123,8 @@ export class ObservedCallEventMonitor { public onMediaSourceAdded?: (mediaSource: ObservedMediaSource, ctx: Context) => void; public onMediaSourceRemoved?: (mediaSource: ObservedMediaSource, ctx: Context) => void; + public onTrackReport?: (trackReport: TrackReport, ctx: Context) => void; + private _onCallAdded(call: ObservedCall) { const onCallEmpty = () => this.onCallEmpty?.(call, this.context); const onCallNotEmpty = () => this.onCallNotEmpty?.(call, this.context); @@ -154,6 +157,7 @@ export class ObservedCallEventMonitor { const onUserMediaError = (error: string) => this._onUserMediaError(observedClient, error); const onClientUpdated = (...args: ObservedClientEvents['update']) => this.onClientUpdated?.(observedClient, args[0], this.context); const onClientEvent = (event: ClientEvent) => this.onClientEvent?.(observedClient, event, this.context); + const onTrackReport = (trackReport: TrackReport) => this._onTrackReport(observedClient, trackReport); observedClient.once('close', () => { observedClient.off('newpeerconnection', this._onPeerConnconnectionAdded); @@ -166,6 +170,7 @@ export class ObservedCallEventMonitor { observedClient.off('usingturn', onUsingTurn); observedClient.off('update', onClientUpdated); observedClient.off('clientEvent', onClientEvent); + observedClient.off('trackreport', onTrackReport); this.onClientClosed?.(observedClient, this.context); }); @@ -181,6 +186,7 @@ export class ObservedCallEventMonitor { observedClient.on('extensionStats', onClientExtensionStats); observedClient.on('update', onClientUpdated); observedClient.on('clientEvent', onClientEvent); + observedClient.on('trackreport', onTrackReport); this.onClientAdded?.(observedClient, this.context); } @@ -389,4 +395,8 @@ export class ObservedCallEventMonitor { private _onUsingTurn(observedClient: ObservedClient, usingTurn: boolean) { this.onClientUsingTurn?.(observedClient, usingTurn, this.context); } + + private _onTrackReport(client: ObservedClient, trackReport: TrackReport) { + this.onTrackReport?.(trackReport, this.context); + } } \ No newline at end of file diff --git a/src/ObservedClient.ts b/src/ObservedClient.ts index 30d1ce7..97c9dee 100644 --- a/src/ObservedClient.ts +++ b/src/ObservedClient.ts @@ -10,6 +10,9 @@ import { ClientMetaTypes } from './schema/ClientMetaTypes'; import { parseJsonAs } from './common/utils'; import { CalculatedScore } from './scores/CalculatedScore'; import { Detectors } from './detectors/Detectors'; +import { ClientReport, TrackReport } from './Reports'; +import { ObservedInboundTrack } from './ObservedInboundTrack'; +import { ObservedOutboundTrack } from './ObservedOutboundTrack'; const logger = createLogger('ObservedClient'); @@ -33,6 +36,8 @@ export type ObservedClientEvents = { clientEvent: [ClientEvent]; newpeerconnection: [ObservedPeerConnection]; + + trackreport: [TrackReport]; }; export declare interface ObservedClient { @@ -77,20 +82,24 @@ export class ObservedClient = Record = Record = Record = Record = Record = Record = Record = Record = Record { + const newObservedPeerConnection = new ObservedPeerConnection(sample.peerConnectionId, this); + const onInboundTrackRemoved = (track: ObservedInboundTrack) => { + this.emit('trackreport', { + direction: 'inbound', + ...track.report, + }); + }; + const onOutboundTrackRemoved = (track: ObservedOutboundTrack) => { + this.emit('trackreport', { + direction: 'outbound', + ...track.report, + }); + }; + + newObservedPeerConnection.once('close', () => { + newObservedPeerConnection?.off('removed-inbound-track', onInboundTrackRemoved); + newObservedPeerConnection?.off('removed-outbound-track', onOutboundTrackRemoved); this.observedPeerConnections.delete(sample.peerConnectionId); }); - this.observedPeerConnections.set(sample.peerConnectionId, observedPeerConnection); + newObservedPeerConnection.on('removed-inbound-track', onInboundTrackRemoved); + newObservedPeerConnection.on('removed-outbound-track', onOutboundTrackRemoved); + this.observedPeerConnections.set(sample.peerConnectionId, newObservedPeerConnection); - this.emit('newpeerconnection', observedPeerConnection); + this.emit('newpeerconnection', newObservedPeerConnection); + + observedPeerConnection = newObservedPeerConnection; } observedPeerConnection.accept(sample); diff --git a/src/ObservedInboundTrack.ts b/src/ObservedInboundTrack.ts index 2f883b9..3142e08 100644 --- a/src/ObservedInboundTrack.ts +++ b/src/ObservedInboundTrack.ts @@ -5,6 +5,7 @@ import { Detectors } from './detectors/Detectors'; import { ObservedPeerConnection } from './ObservedPeerConnection'; import { ObservedInboundRtp } from './ObservedInboundRtp'; import { ObservedMediaPlayout } from './ObservedMediaPlayout'; +import { InboundTrackReport } from './Reports'; export class ObservedInboundTrack implements InboundTrackSample { public readonly detectors: Detectors; @@ -13,6 +14,7 @@ export class ObservedInboundTrack implements InboundTrackSample { value: undefined, }; public appData?: Record; + public report: InboundTrackReport; private _visited = false; @@ -32,6 +34,19 @@ export class ObservedInboundTrack implements InboundTrackSample { private readonly _mediaPlayout?: ObservedMediaPlayout, ) { this.detectors = new Detectors(); + + this.report = { + trackId: this.id, + kind: this.kind, + fractionLostDistribution: { + gtOrEq050: 0, + lt001: 0, + lt005: 0, + lt010: 0, + lt020: 0, + lt050: 0, + }, + }; } public get score() { @@ -68,8 +83,18 @@ export class ObservedInboundTrack implements InboundTrackSample { this.timestamp = stats.timestamp; this.calculatedScore.value = stats.score; this.attachments = stats.attachments; - + + const fl = this._inboundRtp?.fractionLost; + + if (fl !== undefined) { + if (fl < 0.01) this.report.fractionLostDistribution.lt001 += 1; + else if (fl < 0.05) this.report.fractionLostDistribution.lt005 += 1; + else if (fl < 0.1) this.report.fractionLostDistribution.lt010 += 1; + else if (fl < 0.2) this.report.fractionLostDistribution.lt020 += 1; + else if (fl < 0.5) this.report.fractionLostDistribution.lt050 += 1; + else this.report.fractionLostDistribution.gtOrEq050 += 1; + } + this.detectors.update(); } - } \ No newline at end of file diff --git a/src/ObservedOutboundTrack.ts b/src/ObservedOutboundTrack.ts index a841345..e9e9cc1 100644 --- a/src/ObservedOutboundTrack.ts +++ b/src/ObservedOutboundTrack.ts @@ -5,11 +5,14 @@ import { Detectors } from './detectors/Detectors'; import { ObservedPeerConnection } from './ObservedPeerConnection'; import { ObservedOutboundRtp } from './ObservedOutboundRtp'; import { ObservedMediaSource } from './ObservedMediaSource'; +import { OutboundTrackReport } from './Reports'; export class ObservedOutboundTrack implements OutboundTrackSample { public readonly detectors: Detectors; private _visited = false; public appData?: Record; + public readonly report: OutboundTrackReport; + public readonly calculatedScore: CalculatedScore = { weight: 1, value: undefined, @@ -30,6 +33,11 @@ export class ObservedOutboundTrack implements OutboundTrackSample { private readonly _outboundRtps?: ObservedOutboundRtp[], private readonly _mediaSource?: ObservedMediaSource, ) { + this.report = { + trackId: this.id, + kind: this.kind as 'audio' | 'video', + }; + this.detectors = new Detectors(); } diff --git a/src/ObservedPeerConnection.ts b/src/ObservedPeerConnection.ts index 25cb2bc..3ef53f2 100644 --- a/src/ObservedPeerConnection.ts +++ b/src/ObservedPeerConnection.ts @@ -128,9 +128,9 @@ export class ObservedPeerConnection extends EventEmitter { public closedAt?: number; public updated = Date.now(); - public connectionState?: string; - public iceConnectionState?: string; - public iceGatheringState?: string; + public connectionState?: 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed'; + public iceConnectionState?: 'new' | 'checking' | 'connected' | 'completed' | 'failed' | 'disconnected' | 'closed'; + public iceGatheringState?: 'new' | 'gathering' | 'complete'; public availableIncomingBitrate = 0; public availableOutgoingBitrate = 0; @@ -286,6 +286,22 @@ export class ObservedPeerConnection extends EventEmitter { if (this.closed) return; this.closed = true; + this.observedCertificates.forEach((cert) => this.emit('removed-certificate', cert)); + this.observedCodecs.forEach((codec) => this.emit('removed-codec', codec)); + this.observedDataChannels.forEach((dc) => this.emit('removed-data-channel', dc)); + this.observedIceCandidates.forEach((candidate) => this.emit('removed-ice-candidate', candidate)); + this.observedIceCandidatesPair.forEach((pair) => this.emit('removed-ice-candidate-pair', pair)); + this.observedIceTransports.forEach((transport) => this.emit('removed-ice-transport', transport)); + this.observedInboundRtps.forEach((rtp) => this.emit('removed-inbound-rtp', rtp)); + this.observedInboundTracks.forEach((track) => this.emit('removed-inbound-track', track)); + this.observedMediaPlayouts.forEach((playout) => this.emit('removed-media-playout', playout)); + this.observedMediaSources.forEach((source) => this.emit('removed-media-source', source)); + this.observedOutboundRtps.forEach((rtp) => this.emit('removed-outbound-rtp', rtp)); + this.observedOutboundTracks.forEach((track) => this.emit('removed-outbound-track', track)); + this.observedPeerConnectionTransports.forEach((transport) => this.emit('removed-peer-connection-transport', transport)); + this.observedRemoteInboundRtps.forEach((rtp) => this.emit('removed-remote-inbound-rtp', rtp)); + this.observedRemoteOutboundRtps.forEach((rtp) => this.emit('removed-remote-outbound-rtp', rtp)); + this.observedCertificates.clear(); this.observedCodecs.clear(); this.observedDataChannels.clear(); diff --git a/src/Observer.ts b/src/Observer.ts index 092c388..84124b0 100644 --- a/src/Observer.ts +++ b/src/Observer.ts @@ -53,11 +53,6 @@ export class Observer = Record = Record(ctx?: CTX): ObserverEventMonitor { diff --git a/src/Reports.ts b/src/Reports.ts new file mode 100644 index 0000000..fe87f9d --- /dev/null +++ b/src/Reports.ts @@ -0,0 +1,71 @@ +export type InboundAudioTrackReport = { + trackId: string, + fractionLostDistribution: { + lt001: number; + lt005: number; + lt010: number; + lt020: number; + lt050: number; + gtOrEq050: number; + }, +}; + +export type InboundVideoTrackReport = { + trackId: string, + fractionLostDistribution: { + lt001: number; + lt005: number; + lt010: number; + lt020: number; + lt050: number; + gtOrEq050: number; + }, +}; + +export type OutboundAudioTrackReport = { + trackId: string, +}; + +export type OutboundVideoTrackReport = { + trackId: string, +}; + +export type InboundTrackReport = ({ kind: 'audio' } & InboundAudioTrackReport) +| ({ kind: 'video' } & InboundVideoTrackReport); + +export type OutboundTrackReport = ({ kind: 'audio' } & OutboundAudioTrackReport) +| ({ kind: 'video' } & OutboundVideoTrackReport); + +export type TrackReport = ({ direction: 'inbound' } & InboundTrackReport) +| ({ direction: 'outbound' } & OutboundTrackReport); + +export type ClientReport = { + callId: string; + clientId: string; + + totalDataChannelBytesReceived: number; + totalDataChannelBytesSent: number; + totalDataChannelMessagesReceived: number; + totalDataChannelMessagesSent: number; + totalInboundRtpPacketsReceived: number; + totalInboundRtpPacketsLost: number; + totalInboundRtpBytesReceived: number; + totalOutboundRtpPacketsSent: number; + totalOutboundRtpBytesSent: number; + totalAudioBytesReceived: number; + totalVideoBytesReceived: number; + totalAudioBytesSent: number; + totalVideoBytesSent: number; + totalNumberOfIssues: number; + + issues: Record; + + rttDistribution: { + lt50ms: number; + lt150ms: number; + lt300ms: number; + gtOrEq300ms: number; + }, + + scoreDistribution: Record; +} \ No newline at end of file From 36c64166c79807da612bf38fa58a417521296b5a Mon Sep 17 00:00:00 2001 From: balazskreith Date: Mon, 15 Dec 2025 14:53:03 +0200 Subject: [PATCH 4/8] feat: enhance reporting structure by adding count and sum fields to various reports and updating ObservedClient and ObservedInboundTrack classes --- src/ObservedClient.ts | 32 +++++++++++++++++++++++++++----- src/ObservedInboundTrack.ts | 5 +++++ src/ObserverEventMonitor.ts | 10 ++++++++++ src/Reports.ts | 18 +++++++++++++++++- src/index.ts | 4 ++++ 5 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/ObservedClient.ts b/src/ObservedClient.ts index 97c9dee..cf81ecc 100644 --- a/src/ObservedClient.ts +++ b/src/ObservedClient.ts @@ -168,8 +168,19 @@ export class ObservedClient = Record = Record = Record = Record { @@ -160,6 +161,8 @@ export class ObserverEventMonitor { public onMediaSourceRemoved?: (mediaSource: ObservedMediaSource, ctx: Context) => void; public onMediaSourceUpdated?: (mediaSource: ObservedMediaSource, ctx: Context) => void; + public onTrackReport?: (report: TrackReport, observedClient: ObservedClient, ctx: Context) => void; + private _onCallAdded(call: ObservedCall) { const onCallEmpty = () => this.onCallEmpty?.(call, this.context); const onCallNotEmpty = () => this.onCallNotEmpty?.(call, this.context); @@ -192,6 +195,7 @@ export class ObserverEventMonitor { const onUserMediaError = (error: string) => this._onUserMediaError(observedClient, error); const onClientUpdated = (...args: ObservedClientEvents['update']) => this.onClientUpdated?.(observedClient, args[0], this.context); const onClientEvent = (event: ClientEvent) => this.onClientEvent?.(observedClient, event, this.context); + const onTrackReport = (report: TrackReport) => this._onTrackReport(report, observedClient); observedClient.once('close', () => { observedClient.off('newpeerconnection', this._onPeerConnconnectionAdded); @@ -205,6 +209,7 @@ export class ObserverEventMonitor { observedClient.off('extensionStats', onClientExtensionStats); observedClient.off('update', onClientUpdated); observedClient.off('clientEvent', onClientEvent); + observedClient.off('trackreport', onTrackReport); this.onClientClosed?.(observedClient, this.context); }); @@ -220,6 +225,7 @@ export class ObserverEventMonitor { observedClient.on('extensionStats', onClientExtensionStats); observedClient.on('update', onClientUpdated); observedClient.on('clientEvent', onClientEvent); + observedClient.on('trackreport', onTrackReport); this.onClientAdded?.(observedClient, this.context); } @@ -548,4 +554,8 @@ export class ObserverEventMonitor { private _onUsingTurn(observedClient: ObservedClient, usingTurn: boolean) { this.onClientUsingTurn?.(observedClient, usingTurn, this.context); } + + private _onTrackReport(report: TrackReport, observedClient: ObservedClient) { + this.onTrackReport?.(report, observedClient, this.context); + } } \ No newline at end of file diff --git a/src/Reports.ts b/src/Reports.ts index fe87f9d..ffd2344 100644 --- a/src/Reports.ts +++ b/src/Reports.ts @@ -7,6 +7,8 @@ export type InboundAudioTrackReport = { lt020: number; lt050: number; gtOrEq050: number; + count: number; + sum: number; }, }; @@ -19,6 +21,8 @@ export type InboundVideoTrackReport = { lt020: number; lt050: number; gtOrEq050: number; + count: number; + sum: number; }, }; @@ -65,7 +69,19 @@ export type ClientReport = { lt150ms: number; lt300ms: number; gtOrEq300ms: number; + count: number; + sum: number; }, - scoreDistribution: Record; + scoreDistribution: { + '0': number; + '1': number; + '2': number; + '3': number; + '4': number; + '5': number; + + count: number; + sum: number; + } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 2cb6a7a..fd5b15e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,3 +26,7 @@ export { ScoreCalculator } from './scores/ScoreCalculator'; export { ObservedClientEventMonitor } from './ObservedClientEventMonitor'; export { ObserverEventMonitor } from './ObserverEventMonitor'; export { Middleware } from './common/Middleware'; +export { + TrackReport, + ClientReport, +} from './Reports'; From d4122a6e168f935734baea6bc02dc49a918111eb Mon Sep 17 00:00:00 2001 From: balazskreith Date: Mon, 15 Dec 2025 15:09:49 +0200 Subject: [PATCH 5/8] feat: update GitHub Actions workflow for publishing with improved context setup and dependency versions --- .github/workflows/publish.yaml | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index cf2f721..3dbca11 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -1,4 +1,5 @@ name: Publish + on: push: branches: @@ -8,16 +9,23 @@ on: branches: - master +permissions: + contents: read + id-token: write + jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 with: node-version: 20 + registry-url: 'https://registry.npmjs.org' + - name: Install - run: yarn + run: yarn --frozen-lockfile - name: Build run: yarn build @@ -26,12 +34,12 @@ jobs: run: yarn test --detectOpenHandles --forceExit - name: Setup Custom Contexts + id: job_context shell: bash run: | - echo "##[set-output name=branch;]$(echo ${GITHUB_REF##*/})" - echo "##[set-output name=version;]$(cat ./package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[[:space:]]')" - echo "##[set-output name=short_sha;]$(git rev-parse --short HEAD)" - id: job_context + echo "branch=$(echo ${GITHUB_REF##*/})" >> $GITHUB_OUTPUT + echo "version=$(jq -r .version < package.json)" >> $GITHUB_OUTPUT + echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - name: Make snapshot version if: steps.job_context.outputs.branch != 'master' @@ -41,15 +49,10 @@ jobs: - name: Publish package to latest if: steps.job_context.outputs.branch == 'master' run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} npm publish --ignore-scripts --access public - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish package to branch-tag if: steps.job_context.outputs.branch != 'master' run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - npm publish --ignore-scripts --access public --tag $(echo "develop-${{ steps.job_context.outputs.version }}-rc" | sed 's/[.]//g') - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + npm publish --ignore-scripts --access public \ + --tag $(echo "develop-${{ steps.job_context.outputs.version }}-rc" | sed 's/[.]//g') From 5f150ebda9b7b3696e1b5d2b3e2942396d6cabff Mon Sep 17 00:00:00 2001 From: balazskreith Date: Mon, 15 Dec 2025 15:17:11 +0200 Subject: [PATCH 6/8] fix: update GitHub Actions workflow to use stable action versions and improve context setup for publishing --- .github/workflows/publish.yaml | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 3dbca11..cf2f721 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -1,5 +1,4 @@ name: Publish - on: push: branches: @@ -9,23 +8,16 @@ on: branches: - master -permissions: - contents: read - id-token: write - jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 with: node-version: 20 - registry-url: 'https://registry.npmjs.org' - - name: Install - run: yarn --frozen-lockfile + run: yarn - name: Build run: yarn build @@ -34,12 +26,12 @@ jobs: run: yarn test --detectOpenHandles --forceExit - name: Setup Custom Contexts - id: job_context shell: bash run: | - echo "branch=$(echo ${GITHUB_REF##*/})" >> $GITHUB_OUTPUT - echo "version=$(jq -r .version < package.json)" >> $GITHUB_OUTPUT - echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + echo "##[set-output name=branch;]$(echo ${GITHUB_REF##*/})" + echo "##[set-output name=version;]$(cat ./package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[[:space:]]')" + echo "##[set-output name=short_sha;]$(git rev-parse --short HEAD)" + id: job_context - name: Make snapshot version if: steps.job_context.outputs.branch != 'master' @@ -49,10 +41,15 @@ jobs: - name: Publish package to latest if: steps.job_context.outputs.branch == 'master' run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} npm publish --ignore-scripts --access public + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish package to branch-tag if: steps.job_context.outputs.branch != 'master' run: | - npm publish --ignore-scripts --access public \ - --tag $(echo "develop-${{ steps.job_context.outputs.version }}-rc" | sed 's/[.]//g') + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + npm publish --ignore-scripts --access public --tag $(echo "develop-${{ steps.job_context.outputs.version }}-rc" | sed 's/[.]//g') + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} From a1dd87c45a6faa47febea962f64b6068d90b38ba Mon Sep 17 00:00:00 2001 From: balazskreith Date: Mon, 15 Dec 2025 15:43:25 +0200 Subject: [PATCH 7/8] fix: change export statement for TrackReport and ClientReport to use type export --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index fd5b15e..05bbef0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,7 +26,7 @@ export { ScoreCalculator } from './scores/ScoreCalculator'; export { ObservedClientEventMonitor } from './ObservedClientEventMonitor'; export { ObserverEventMonitor } from './ObserverEventMonitor'; export { Middleware } from './common/Middleware'; -export { +export type { TrackReport, ClientReport, } from './Reports'; From b276103bdc9462f7b8a55dc0a33ccac742d04e9d Mon Sep 17 00:00:00 2001 From: balazskreith Date: Mon, 15 Dec 2025 15:46:46 +0200 Subject: [PATCH 8/8] fix: update version in package.json to 1.0.0-beta.3 --- etc/model-generator/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/model-generator/package.json b/etc/model-generator/package.json index 54f6e56..964fb42 100644 --- a/etc/model-generator/package.json +++ b/etc/model-generator/package.json @@ -1,6 +1,6 @@ { "name": "model-generator-for-observer-js", - "version": "1.0.0", + "version": "1.0.0-beta.3", "description": "Simple NodeJS to generate Models for observer-js", "main": "index.js", "scripts": {