     # "@_syncstring_table.set(...)" below because it is critical to
     # to be able to do the touch before @_syncstring_table gets initialized,
     # since otherwise the initial open a file will be very slow.
-    touch: (min_age_m=5) =>
+    touch: (min_age_m=5, cb) =>
         if @_client.is_project()
+            cb?()
             return
         if min_age_m > 0
-            # if min_age_m is 0 always do it immediately; if > 0 check what it was:
+            # if min_age_m is 0 always try to do it immediately; if > 0 check what it was:
             last_active = @_syncstring_table?.get_one()?.get('last_active')
             # if not defined or not set recently, do it.
             if not (not last_active? or +last_active <= +misc.server_minutes_ago(min_age_m))
+                cb?()
                 return
         # Now actually do the set.
         @_client.query

                    deleted     : @_deleted
                    last_active : misc.server_time()
                    doctype     : misc.to_json(@_doctype)  # important to set here, since this is when syncstring is often first created

    # The project calls this once it has checked for the file on disk; this
    # way the frontend knows that the syncstring has been initialized in

        if not @_closed
            cb("already connected")
            return
        query =
            syncstrings :
                string_id         : @_string_id
