@@ -34,71 +34,117 @@ export async function POST(req: Request) {
34
34
}
35
35
36
36
console . log ( 'JSON parsed successfully, items:' , jsonData . length ) ;
37
- const results = [ ] ;
37
+ interface ProcessedItem {
38
+ id : string ;
39
+ source : string ;
40
+ chapter : string ;
41
+ }
42
+ const results : ProcessedItem [ ] = [ ] ;
38
43
const totalItems = jsonData . length ;
39
44
40
- for ( let i = 0 ; i < jsonData . length ; i ++ ) {
41
- const item = jsonData [ i ] ;
42
- if ( ! item . source || ! item . chapter || ! item . text ) {
43
- console . log ( 'Skipping invalid item:' , item ) ;
44
- continue ;
45
- }
45
+ // Create a TransformStream for streaming responses
46
+ const stream = new TransformStream ( ) ;
47
+ const writer = stream . writable . getWriter ( ) ;
48
+ const encoder = new TextEncoder ( ) ;
46
49
47
- console . log ( 'Processing item' , i + 1 , 'of' , totalItems ) ;
48
-
50
+ // Start processing in the background
51
+ ( async ( ) => {
49
52
try {
50
- // Insert into resources table
51
- console . log ( 'Inserting into resources table...' ) ;
52
- const [ resource ] = await db
53
- . insert ( resources )
54
- . values ( {
55
- content : item . text ,
56
- source : item . source ,
57
- chapter : item . chapter ,
58
- } )
59
- . returning ( ) ;
53
+ // Process items in batches to show progress
54
+ const batchSize = 5 ;
55
+ for ( let i = 0 ; i < jsonData . length ; i += batchSize ) {
56
+ const batch = jsonData . slice ( i , i + batchSize ) ;
57
+
58
+ for ( const item of batch ) {
59
+ if ( ! item . source || ! item . chapter || ! item . text ) {
60
+ console . log ( 'Skipping invalid item:' , item ) ;
61
+ continue ;
62
+ }
60
63
61
- console . log ( 'Resource inserted:' , resource . id ) ;
64
+ try {
65
+ // Insert into resources table
66
+ const [ resource ] = await db
67
+ . insert ( resources )
68
+ . values ( {
69
+ content : item . text ,
70
+ source : item . source ,
71
+ chapter : item . chapter ,
72
+ } )
73
+ . returning ( ) ;
62
74
63
- // Generate embeddings
64
- console . log ( 'Generating embeddings...' ) ;
65
- const embeddingResults = await generateEmbeddings ( item . text ) ;
66
- console . log ( 'Embeddings generated:' , embeddingResults . length ) ;
67
-
68
- // Insert embeddings
69
- console . log ( 'Inserting embeddings...' ) ;
70
- for ( const embeddingResult of embeddingResults ) {
71
- await db . insert ( embeddings ) . values ( {
72
- resourceId : resource . id ,
73
- content : embeddingResult . content ,
74
- embedding : embeddingResult . embedding ,
75
- } ) ;
76
- }
75
+ // Generate embeddings
76
+ const embeddingResults = await generateEmbeddings ( item . text ) ;
77
+
78
+ // Insert embeddings
79
+ for ( const embeddingResult of embeddingResults ) {
80
+ await db . insert ( embeddings ) . values ( {
81
+ resourceId : resource . id ,
82
+ content : embeddingResult . content ,
83
+ embedding : embeddingResult . embedding ,
84
+ } ) ;
85
+ }
86
+
87
+ results . push ( {
88
+ id : resource . id ,
89
+ source : item . source ,
90
+ chapter : item . chapter ,
91
+ } ) ;
77
92
78
- results . push ( {
79
- id : resource . id ,
80
- source : item . source ,
81
- chapter : item . chapter ,
82
- } ) ;
93
+ } catch ( dbError ) {
94
+ console . error ( 'Database error processing item:' , dbError ) ;
95
+ continue ;
96
+ }
97
+ }
83
98
84
- } catch ( dbError ) {
85
- console . error ( 'Database error processing item:' , dbError ) ;
86
- // Continue with next item even if this one fails
87
- continue ;
99
+ // Send progress update after each batch
100
+ const processed = Math . min ( i + batchSize , jsonData . length ) ;
101
+ console . log ( `Processed ${ processed } of ${ totalItems } items` ) ;
102
+
103
+ await writer . write ( encoder . encode (
104
+ `data: ${ JSON . stringify ( {
105
+ type : 'progress' ,
106
+ processed,
107
+ total : totalItems ,
108
+ } ) } \n\n`
109
+ ) ) ;
110
+ }
111
+
112
+ // Send final completion message
113
+ await writer . write ( encoder . encode (
114
+ `data: ${ JSON . stringify ( {
115
+ type : 'complete' ,
116
+ success : true ,
117
+ processed : results . length ,
118
+ total : totalItems ,
119
+ results,
120
+ } ) } \n\n`
121
+ ) ) ;
122
+ } catch ( error ) {
123
+ console . error ( 'Error during processing:' , error ) ;
124
+ await writer . write ( encoder . encode (
125
+ `data: ${ JSON . stringify ( {
126
+ type : 'error' ,
127
+ error : 'Error processing file' ,
128
+ details : error instanceof Error ? error . message : 'Unknown error' ,
129
+ } ) } \n\n`
130
+ ) ) ;
131
+ } finally {
132
+ await writer . close ( ) ;
88
133
}
89
- }
134
+ } ) ( ) ;
90
135
91
- console . log ( 'Upload process completed' ) ;
92
- return NextResponse . json ( {
93
- success : true ,
94
- processed : results . length ,
95
- total : totalItems ,
96
- results
136
+ return new Response ( stream . readable , {
137
+ headers : {
138
+ 'Content-Type' : 'text/event-stream' ,
139
+ 'Cache-Control' : 'no-cache' ,
140
+ 'Connection' : 'keep-alive' ,
141
+ } ,
97
142
} ) ;
98
143
99
144
} catch ( error ) {
100
145
console . error ( 'Error processing file:' , error ) ;
101
146
return NextResponse . json ( {
147
+ type : 'error' ,
102
148
error : 'Error processing file' ,
103
149
details : error instanceof Error ? error . message : 'Unknown error'
104
150
} , { status : 500 } ) ;
0 commit comments