• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

supabase / storage / 23951363366

03 Apr 2026 03:21PM UTC coverage: 80.45% (-0.03%) from 80.479%
23951363366

Pull #965

github

web-flow
Merge ca6a1e7dd into 1587bf2e8
Pull Request #965: fix: report errors in orphan and test entity expansion

3126 of 4067 branches covered (76.86%)

Branch coverage included in aggregate %.

104 of 153 new or added lines in 4 files covered. (67.97%)

7 existing lines in 1 file now uncovered.

30012 of 37124 relevant lines covered (80.84%)

311.36 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

72.86
/src/scripts/orphan-client-stream.ts
1
import fs from 'fs'
1✔
2

1✔
3
export interface OrphanObject {
1✔
4
  event: 'data'
1✔
5
  type: 'dbOrphans' | 's3Orphans'
1✔
6
  value: {
1✔
7
    name: string
1✔
8
    version: string
1✔
9
    size: number
1✔
10
  }[]
1✔
11
}
1✔
12

1✔
13
export interface PingObject {
1✔
14
  event: 'ping'
1✔
15
}
1✔
16

1✔
17
export interface StreamedErrorPayload {
1✔
18
  statusCode: string
1✔
19
  code: string
1✔
20
  error: string
1✔
21
  message: string
1✔
22
}
1✔
23

1✔
24
export interface ErrorObject {
1✔
25
  event: 'error'
1✔
26
  error: StreamedErrorPayload
1✔
27
}
1✔
28

1✔
29
export type OrphanStreamEvent = OrphanObject | PingObject | ErrorObject
1✔
30

1✔
31
export function formatOrphanStreamError(error: StreamedErrorPayload) {
2✔
32
  return `[${error.code}] ${error.message}`
2✔
33
}
2✔
34

1✔
35
export async function writeStreamToJsonArray(
1✔
36
  stream: NodeJS.ReadableStream,
1✔
37
  filePath: string
1✔
38
): Promise<void> {
1✔
39
  const localFile = fs.createWriteStream(filePath)
1✔
40

1✔
41
  localFile.write('[\n')
1✔
42
  let isFirstItem = true
1✔
43

1✔
44
  return new Promise((resolve, reject) => {
1✔
45
    let fileClosed = false
1✔
46
    let receivedAnyData = false
1✔
47
    let streamedError: Error | undefined
1✔
48

1✔
49
    const closeFile = (onClose: () => void) => {
1✔
50
      if (fileClosed) {
1!
NEW
51
        return
×
NEW
52
      }
×
53

1✔
54
      fileClosed = true
1✔
55
      localFile.end('\n]', onClose)
1✔
56
    }
1✔
57

1✔
58
    stream.on('data', (data: OrphanStreamEvent) => {
1✔
59
      if (data.event === 'ping') {
2!
NEW
60
        console.log('Received ping event, ignoring')
×
NEW
61
        return
×
NEW
62
      }
×
63

2✔
64
      if (data.event === 'error') {
2✔
65
        streamedError = new Error(formatOrphanStreamError(data.error))
1✔
66
        console.error('Server error:', formatOrphanStreamError(data.error))
1✔
67
        return
1✔
68
      }
1✔
69

1✔
70
      if (data.value && Array.isArray(data.value)) {
2✔
71
        receivedAnyData = true
1✔
72
        console.log(`Processing ${data.value.length} objects`)
1✔
73

1✔
74
        for (const item of data.value) {
1✔
75
          if (!isFirstItem) {
1!
NEW
76
            localFile.write(',\n')
×
77
          } else {
1✔
78
            isFirstItem = false
1✔
79
          }
1✔
80

1✔
81
          localFile.write(JSON.stringify({ ...item, orphanType: data.type }, null, 2))
1✔
82
        }
1✔
83
        return
1✔
84
      }
1✔
NEW
85

×
NEW
86
      console.warn(
×
NEW
87
        'Received data with invalid format:',
×
NEW
88
        JSON.stringify(data).substring(0, 100) + '...'
×
NEW
89
      )
×
90
    })
1✔
91

1✔
92
    stream.on('error', (err: Error) => {
1✔
NEW
93
      if (err.message === 'DELETE_LIMIT_REACHED') {
×
NEW
94
        closeFile(() => {
×
NEW
95
          if (receivedAnyData) {
×
NEW
96
            console.log(`Finished writing data to ${filePath}. Delete limit reached, data saved.`)
×
NEW
97
          }
×
NEW
98
          resolve()
×
NEW
99
        })
×
NEW
100
        return
×
NEW
101
      }
×
NEW
102

×
NEW
103
      console.error('Stream error:', err)
×
NEW
104
      closeFile(() => {
×
NEW
105
        reject(err)
×
NEW
106
      })
×
107
    })
1✔
108

1✔
109
    stream.on('end', () => {
1✔
110
      closeFile(() => {
1✔
111
        if (streamedError) {
1✔
112
          reject(streamedError)
1✔
113
          return
1✔
114
        }
1✔
NEW
115

×
NEW
116
        if (!receivedAnyData) {
×
NEW
117
          console.warn(`No data was received! File might be empty: ${filePath}`)
×
NEW
118
        } else {
×
NEW
119
          console.log(`Finished writing data to ${filePath}. Data was received and saved.`)
×
NEW
120
        }
×
NEW
121

×
NEW
122
        resolve()
×
123
      })
1✔
124
    })
1✔
125
  })
1✔
126
}
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc