| 
					
				 | 
			
			
				@@ -53,10 +53,14 @@ export class Session { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   async start() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this.output("220 smtp2rss"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await this.output("220 smtp2rss"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for await (const chunk of newlineIterator(iterateReader(this.conn))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.input(chunk); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (await this.input(chunk)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await this.output("221 smtp2rss closing"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.conn.close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   input(data: string) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -74,65 +78,64 @@ export class Session { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  waitingHello(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async waitingHello(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const command = data.substring(0, 4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (command === "HELO" || command === "EHLO") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.state = State.WaitingMail; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  waitingMail(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async waitingMail(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const command = data.substring(0, 4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (command === "MAIL") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const match = data.match(/^MAIL FROM:<([^>]*)>.*$/); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (match !== null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.sender = match[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.state = State.WaitingRecipient; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        await this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        this.output("500 Invalid sender"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        await this.output("500 Invalid sender"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else if (command === "QUIT") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("221 smtp2rss closing"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.conn.close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  waitingRecipient(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async waitingRecipient(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const command = data.substring(0, 4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (command === "RCPT") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const match = data.match(/^RCPT TO:<([^>]*)>.*$/); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (match !== null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.recipient = match[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.state = State.WaitingData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        await this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        this.output("500 Invalid sender"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        await this.output("500 Invalid sender"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  waitingData(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async waitingData(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const command = data.substring(0, 4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (command === "DATA") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.state = State.ReceivingData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("354 Waiting for data"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await this.output("354 Waiting for data"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await this.output("500 Invalid state"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  receivingData(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async receivingData(data: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (data === ".") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.state = State.WaitingMail; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await this.output("250 OK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.onReceive(this.recipient, this.sender, this.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.recipient = ""; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -143,8 +146,8 @@ export class Session { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  output(response: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this.conn.write(this.encoder.encode(`${response}\r\n`)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  output(response: string): Promise<number> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return this.conn.write(this.encoder.encode(`${response}\r\n`)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |