Hex Artifact Content
Not logged in

Artifact 3e85c6490eb76db1cf3b3d2e5a304b2d302bf71c:


0000: 63 6f 6e 73 74 20 66 66 69 20 3d 20 72 65 71 75  const ffi = requ
0010: 69 72 65 28 27 66 66 69 27 29 3b 0a 63 6f 6e 73  ire('ffi');.cons
0020: 74 20 72 65 66 20 3d 20 72 65 71 75 69 72 65 28  t ref = require(
0030: 22 72 65 66 22 29 3b 0a 63 6f 6e 73 74 20 53 74  "ref");.const St
0040: 72 75 63 74 20 3d 20 72 65 71 75 69 72 65 28 27  ruct = require('
0050: 72 65 66 2d 73 74 72 75 63 74 27 29 3b 0a 63 6f  ref-struct');.co
0060: 6e 73 74 20 62 61 73 65 20 3d 20 72 65 71 75 69  nst base = requi
0070: 72 65 28 27 2e 2f 5f 62 61 73 65 27 29 3b 0a 63  re('./_base');.c
0080: 6f 6e 73 74 20 4d 44 61 74 61 49 6e 66 6f 48 61  onst MDataInfoHa
0090: 6e 64 6c 65 20 3d 20 72 65 71 75 69 72 65 28 27  ndle = require('
00a0: 2e 2f 5f 6d 75 74 61 62 6c 65 27 29 2e 74 79 70  ./_mutable').typ
00b0: 65 73 2e 4d 44 61 74 61 49 6e 66 6f 48 61 6e 64  es.MDataInfoHand
00c0: 6c 65 3b 0a 63 6f 6e 73 74 20 74 20 3d 20 62 61  le;.const t = ba
00d0: 73 65 2e 74 79 70 65 73 3b 0a 63 6f 6e 73 74 20  se.types;.const 
00e0: 68 20 3d 20 62 61 73 65 2e 68 65 6c 70 65 72 73  h = base.helpers
00f0: 3b 0a 0a 63 6f 6e 73 74 20 46 69 6c 65 20 3d 20  ;..const File = 
0100: 53 74 72 75 63 74 28 7b 0a 20 20 73 69 7a 65 3a  Struct({.  size:
0110: 20 74 2e 75 36 34 2c 0a 20 20 63 72 65 61 74 65   t.u64,.  create
0120: 64 3a 20 74 2e 54 69 6d 65 2c 20 2f 2f 20 54 4f  d: t.Time, // TO
0130: 44 4f 20 66 69 78 20 69 74 20 66 6f 72 20 54 4d  DO fix it for TM
0140: 0a 20 20 6d 6f 64 69 66 69 65 64 3a 20 74 2e 54  .  modified: t.T
0150: 69 6d 65 2c 20 2f 2f 20 54 4f 44 4f 20 66 69 78  ime, // TODO fix
0160: 20 69 74 20 66 6f 72 20 54 4d 0a 20 20 75 73 65   it for TM.  use
0170: 72 5f 6d 65 74 61 64 61 74 61 5f 70 74 72 3a 20  r_metadata_ptr: 
0180: 74 2e 75 38 50 6f 69 6e 74 65 72 2c 0a 20 20 75  t.u8Pointer,.  u
0190: 73 65 72 5f 6d 65 74 61 64 61 74 61 5f 6c 65 6e  ser_metadata_len
01a0: 3a 20 74 2e 75 73 69 7a 65 2c 0a 20 20 75 73 65  : t.usize,.  use
01b0: 72 5f 6d 65 74 61 64 61 74 61 5f 63 61 70 3a 20  r_metadata_cap: 
01c0: 74 2e 75 73 69 7a 65 2c 0a 20 20 64 61 74 61 5f  t.usize,.  data_
01d0: 6d 61 70 5f 6e 61 6d 65 3a 20 74 2e 58 4f 52 5f  map_name: t.XOR_
01e0: 4e 41 4d 45 0a 7d 29 3b 0a 0a 63 6f 6e 73 74 20  NAME.});..const 
01f0: 46 69 6c 65 50 74 72 20 3d 20 72 65 66 2e 72 65  FilePtr = ref.re
0200: 66 54 79 70 65 28 46 69 6c 65 29 3b 0a 0a 6d 6f  fType(File);..mo
0210: 64 75 6c 65 2e 65 78 70 6f 72 74 73 20 3d 20 7b  dule.exports = {
0220: 0a 20 20 74 79 70 65 73 3a 20 7b 0a 20 20 20 20  .  types: {.    
0230: 46 69 6c 65 2c 0a 20 20 20 20 46 69 6c 65 50 74  File,.    FilePt
0240: 72 0a 20 20 7d 2c 0a 20 20 66 75 6e 63 74 69 6f  r.  },.  functio
0250: 6e 73 3a 20 7b 0a 20 20 20 20 66 69 6c 65 5f 66  ns: {.    file_f
0260: 65 74 63 68 3a 20 5b 74 2e 56 6f 69 64 2c 20 5b  etch: [t.Void, [
0270: 74 2e 41 70 70 50 74 72 2c 20 4d 44 61 74 61 49  t.AppPtr, MDataI
0280: 6e 66 6f 48 61 6e 64 6c 65 2c 20 27 73 74 72 69  nfoHandle, 'stri
0290: 6e 67 27 2c 20 27 70 6f 69 6e 74 65 72 27 2c 20  ng', 'pointer', 
02a0: 27 70 6f 69 6e 74 65 72 27 5d 5d 2c 0a 20 20 20  'pointer']],.   
02b0: 20 66 69 6c 65 5f 69 6e 73 65 72 74 3a 20 5b 74   file_insert: [t
02c0: 2e 56 6f 69 64 2c 20 5b 74 2e 41 70 70 50 74 72  .Void, [t.AppPtr
02d0: 2c 20 4d 44 61 74 61 49 6e 66 6f 48 61 6e 64 6c  , MDataInfoHandl
02e0: 65 2c 20 27 73 74 72 69 6e 67 27 2c 20 46 69 6c  e, 'string', Fil
02f0: 65 50 74 72 2c 20 27 70 6f 69 6e 74 65 72 27 2c  ePtr, 'pointer',
0300: 20 27 70 6f 69 6e 74 65 72 27 5d 5d 2c 0a 20 20   'pointer']],.  
0310: 20 20 66 69 6c 65 5f 75 70 64 61 74 65 3a 20 5b    file_update: [
0320: 74 2e 56 6f 69 64 2c 20 5b 74 2e 41 70 70 50 74  t.Void, [t.AppPt
0330: 72 2c 20 4d 44 61 74 61 49 6e 66 6f 48 61 6e 64  r, MDataInfoHand
0340: 6c 65 2c 20 27 73 74 72 69 6e 67 27 2c 20 46 69  le, 'string', Fi
0350: 6c 65 50 74 72 2c 20 74 2e 75 36 34 2c 20 27 70  lePtr, t.u64, 'p
0360: 6f 69 6e 74 65 72 27 2c 20 27 70 6f 69 6e 74 65  ointer', 'pointe
0370: 72 27 5d 5d 0a 20 20 7d 2c 0a 20 20 61 70 69 3a  r']].  },.  api:
0380: 20 7b 0a 20 20 20 20 66 69 6c 65 5f 66 65 74 63   {.    file_fetc
0390: 68 3a 20 68 2e 50 72 6f 6d 69 73 69 66 69 65 64  h: h.Promisified
03a0: 28 6e 75 6c 6c 2c 20 5b 46 69 6c 65 50 74 72 2c  (null, [FilePtr,
03b0: 20 74 2e 75 36 34 5d 2c 20 28 72 65 73 29 20 3d   t.u64], (res) =
03c0: 3e 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  > {.      const 
03d0: 66 69 6c 65 20 3d 20 72 65 73 5b 30 5d 2e 64 65  file = res[0].de
03e0: 72 65 66 28 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ref();.      con
03f0: 73 74 20 64 61 74 61 5f 6d 61 70 5f 6e 61 6d 65  st data_map_name
0400: 20 3d 20 66 69 6c 65 2e 64 61 74 61 5f 6d 61 70   = file.data_map
0410: 5f 6e 61 6d 65 3b 0a 20 20 20 20 20 20 63 6f 6e  _name;.      con
0420: 73 74 20 73 69 7a 65 20 3d 20 66 69 6c 65 2e 73  st size = file.s
0430: 69 7a 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ize;.      const
0440: 20 63 72 65 61 74 65 64 20 3d 20 66 69 6c 65 2e   created = file.
0450: 63 72 65 61 74 65 64 3b 0a 20 20 20 20 20 20 63  created;.      c
0460: 6f 6e 73 74 20 6d 6f 64 69 66 69 65 64 20 3d 20  onst modified = 
0470: 66 69 6c 65 2e 6d 6f 64 69 66 69 65 64 3b 0a 20  file.modified;. 
0480: 20 20 20 20 20 6c 65 74 20 6d 65 74 61 64 61 74       let metadat
0490: 61 20 3d 20 66 69 6c 65 2e 75 73 65 72 5f 6d 65  a = file.user_me
04a0: 74 61 64 61 74 61 5f 6c 65 6e 20 3e 20 30 0a 20  tadata_len > 0. 
04b0: 20 20 20 20 20 20 20 3f 20 72 65 66 2e 72 65 69         ? ref.rei
04c0: 6e 74 65 72 70 72 65 74 28 66 69 6c 65 2e 75 73  nterpret(file.us
04d0: 65 72 5f 6d 65 74 61 64 61 74 61 5f 70 74 72 2c  er_metadata_ptr,
04e0: 20 66 69 6c 65 2e 75 73 65 72 5f 6d 65 74 61 64   file.user_metad
04f0: 61 74 61 5f 6c 65 6e 29 20 3a 20 6e 75 6c 6c 3b  ata_len) : null;
0500: 0a 0a 20 20 20 20 20 20 69 66 20 28 6d 65 74 61  ..      if (meta
0510: 64 61 74 61 29 20 7b 0a 20 20 20 20 20 20 20 20  data) {.        
0520: 2f 2f 20 77 65 20 74 72 79 20 74 6f 20 75 6e 64  // we try to und
0530: 65 72 73 74 61 6e 64 20 69 74 20 61 73 20 4a 53  erstand it as JS
0540: 4f 4e 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  ON.        try {
0550: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 74 61 64  .          metad
0560: 61 74 61 20 3d 20 4a 53 4f 4e 2e 70 61 72 73 65  ata = JSON.parse
0570: 28 6d 65 74 61 64 61 74 61 29 3b 0a 20 20 20 20  (metadata);.    
0580: 20 20 20 20 7d 20 63 61 74 63 68 20 28 65 29 20      } catch (e) 
0590: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 77  {.          // w
05a0: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69 67 6e  e can safely ign
05b0: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20  ore this.       
05c0: 20 20 20 69 66 20 28 63 6f 6e 73 6f 6c 65 20 26     if (console &
05d0: 26 20 63 6f 6e 73 6f 6c 65 2e 77 61 72 6e 29 20  & console.warn) 
05e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
05f0: 6e 73 6f 6c 65 2e 77 61 72 6e 28 60 50 61 72 73  nsole.warn(`Pars
0600: 69 6e 67 20 75 73 65 72 20 6d 65 74 61 64 61 74  ing user metadat
0610: 61 20 27 24 7b 6d 65 74 61 64 61 74 61 7d 27 20  a '${metadata}' 
0620: 6f 66 20 27 24 7b 64 61 74 61 5f 6d 61 70 5f 6e  of '${data_map_n
0630: 61 6d 65 7d 27 20 66 61 69 6c 65 64 3a 20 24 7b  ame}' failed: ${
0640: 65 7d 60 29 0a 20 20 20 20 20 20 20 20 20 20 7d  e}`).          }
0650: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0660: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
0670: 7b 6d 65 74 61 64 61 74 61 2c 0a 20 20 20 20 20  {metadata,.     
0680: 20 20 20 20 20 20 20 20 20 64 61 74 61 5f 6d 61           data_ma
0690: 70 5f 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  p_name,.        
06a0: 20 20 20 20 20 20 73 69 7a 65 2c 0a 20 20 20 20        size,.    
06b0: 20 20 20 20 20 20 20 20 20 20 63 72 65 61 74 65            create
06c0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
06d0: 20 6d 6f 64 69 66 69 65 64 2c 0a 20 20 20 20 20   modified,.     
06e0: 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e           version
06f0: 3a 20 72 65 73 5b 31 5d 7d 0a 20 20 20 20 7d 29  : res[1]}.    })
0700: 2c 0a 20 20 20 20 66 69 6c 65 5f 69 6e 73 65 72  ,.    file_inser
0710: 74 3a 20 68 2e 50 72 6f 6d 69 73 69 66 69 65 64  t: h.Promisified
0720: 28 6e 75 6c 6c 2c 20 5b 5d 29 2c 0a 20 20 20 20  (null, []),.    
0730: 66 69 6c 65 5f 75 70 64 61 74 65 3a 20 68 2e 50  file_update: h.P
0740: 72 6f 6d 69 73 69 66 69 65 64 28 6e 75 6c 6c 2c  romisified(null,
0750: 20 5b 5d 29 0a 20 20 7d 0a 7d                     []).  }.}