Use HandleAllocator in legacy FS. NFC
diff --git a/src/library_fs.js b/src/library_fs.js
index 79970eb..627d710 100644
--- a/src/library_fs.js
+++ b/src/library_fs.js
@@ -12,6 +12,7 @@
     '$intArrayFromString',
     '$stringToUTF8Array',
     '$lengthBytesUTF8',
+    '$HandleAllocator',
 #if LibraryManager.has('library_idbfs.js')
     '$IDBFS',
 #endif
@@ -100,7 +101,6 @@
     root: null,
     mounts: [],
     devices: {},
-    streams: [],
     nextInode: 1,
     nameTable: null,
     currentPath: '/',
@@ -381,7 +381,7 @@
       }
       throw new FS.ErrnoError({{{ cDefs.EMFILE }}});
     },
-    getStream: (fd) => FS.streams[fd],
+    getStream: (fd) => FS.streams.allocated[fd],
     // TODO parameterize this function such that a stream
     // object isn't directly passed in. not possible until
     // SOCKFS is completed.
@@ -427,14 +427,18 @@
       // clone it, so we can return an instance of FSStream
       stream = Object.assign(new FS.FSStream(), stream);
       if (fd == -1) {
-        fd = FS.nextfd();
+        fd = FS.streams.allocate(stream);
+      } else {
+        while (FS.streams.allocated.length <= fd) {
+          FS.streams.allocated.push();
+        }
+        FS.streams.allocated[fd] = stream;
       }
       stream.fd = fd;
-      FS.streams[fd] = stream;
       return stream;
     },
     closeStream: (fd) => {
-      FS.streams[fd] = null;
+      FS.streams.free(fd);
     },
 
     //
@@ -1490,6 +1494,11 @@
       assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');
 #endif
       FS.init.initialized = true;
+      FS.streams = new HandleAllocator();
+      // Clear the default allocated list since the default HandleAllocator
+      // starts with `undefined` to avoid handing out hangle zero, but in the
+      // case of file handles zero is a valid handle (stdin).
+      FS.streams.allocated = []
 
       FS.ensureErrnoError();
 
@@ -1507,13 +1516,7 @@
       _fflush(0);
 #endif
       // close all of our streams
-      for (var i = 0; i < FS.streams.length; i++) {
-        var stream = FS.streams[i];
-        if (!stream) {
-          continue;
-        }
-        FS.close(stream);
-      }
+      FS.streams.allocated.forEach((stream) => stream && FS.close(stream));
     },
 
     //
diff --git a/src/library_noderawfs.js b/src/library_noderawfs.js
index 4de762e..2471f02 100644
--- a/src/library_noderawfs.js
+++ b/src/library_noderawfs.js
@@ -107,8 +107,8 @@
       return rtn;
     },
     closeStream: function(fd) {
-      if (FS.streams[fd]) {
-        FS.streams[fd].shared.refcnt--;
+      if (FS.streams.has(fd)) {
+        FS.streams.get(fd).shared.refcnt--;
       }
       VFS.closeStream(fd);
     },
diff --git a/test/fs/test_mmap.c b/test/fs/test_mmap.c
index 5d3927d..3ee67d2 100644
--- a/test/fs/test_mmap.c
+++ b/test/fs/test_mmap.c
@@ -236,7 +236,7 @@
   }
 
   EM_ASM({
-    const stream = FS.streams.find(stream => stream.path.indexOf('yolo/overallocatedfile.txt') >= 0);
+    const stream = FS.streams.allocated.find(stream => stream.path.indexOf('yolo/overallocatedfile.txt') >= 0);
     assert(stream.node.usedBytes === Number($0),
       'Used bytes on the over-allocated file (' + stream.node.usedBytes + ') ' +
       'should be ' + $0
diff --git a/test/other/metadce/test_metadce_cxx_ctors1.jssize b/test/other/metadce/test_metadce_cxx_ctors1.jssize
index b7e0851..476374f 100644
--- a/test/other/metadce/test_metadce_cxx_ctors1.jssize
+++ b/test/other/metadce/test_metadce_cxx_ctors1.jssize
@@ -1 +1 @@
-25948
+26192
diff --git a/test/other/metadce/test_metadce_cxx_ctors2.jssize b/test/other/metadce/test_metadce_cxx_ctors2.jssize
index 5c59d01..a177257 100644
--- a/test/other/metadce/test_metadce_cxx_ctors2.jssize
+++ b/test/other/metadce/test_metadce_cxx_ctors2.jssize
@@ -1 +1 @@
-25912
+26156
diff --git a/test/other/metadce/test_metadce_cxx_except.jssize b/test/other/metadce/test_metadce_cxx_except.jssize
index 3bd9928..edddd17 100644
--- a/test/other/metadce/test_metadce_cxx_except.jssize
+++ b/test/other/metadce/test_metadce_cxx_except.jssize
@@ -1 +1 @@
-30462
+30707
diff --git a/test/other/metadce/test_metadce_cxx_except_wasm.jssize b/test/other/metadce/test_metadce_cxx_except_wasm.jssize
index dabbf8a..d220510 100644
--- a/test/other/metadce/test_metadce_cxx_except_wasm.jssize
+++ b/test/other/metadce/test_metadce_cxx_except_wasm.jssize
@@ -1 +1 @@
-25757
+26001
diff --git a/test/other/metadce/test_metadce_cxx_mangle.jssize b/test/other/metadce/test_metadce_cxx_mangle.jssize
index 74bf7aa..d7d7825 100644
--- a/test/other/metadce/test_metadce_cxx_mangle.jssize
+++ b/test/other/metadce/test_metadce_cxx_mangle.jssize
@@ -1 +1 @@
-30461
+30706
diff --git a/test/other/metadce/test_metadce_cxx_noexcept.jssize b/test/other/metadce/test_metadce_cxx_noexcept.jssize
index b7e0851..476374f 100644
--- a/test/other/metadce/test_metadce_cxx_noexcept.jssize
+++ b/test/other/metadce/test_metadce_cxx_noexcept.jssize
@@ -1 +1 @@
-25948
+26192