@ibgib/web-gib 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ibgibignore +30 -0
- package/.vscode/ibgib-snippets.code-snippets +309 -0
- package/.vscode/launch.json +25 -0
- package/.vscode/settings.json +68 -0
- package/.vscode/tasks.json +38 -0
- package/CHANGELOG.md +427 -0
- package/README.md +66 -0
- package/dist/agent-texts/common-agent-texts.d.mts +14 -0
- package/dist/agent-texts/common-agent-texts.d.mts.map +1 -0
- package/dist/agent-texts/common-agent-texts.mjs +51 -0
- package/dist/agent-texts/common-agent-texts.mjs.map +1 -0
- package/dist/agent-texts/primary-agent-texts.d.mts +16 -0
- package/dist/agent-texts/primary-agent-texts.d.mts.map +1 -0
- package/dist/agent-texts/primary-agent-texts.mjs +27 -0
- package/dist/agent-texts/primary-agent-texts.mjs.map +1 -0
- package/dist/agent-texts/project-agent-texts.d.mts +8 -0
- package/dist/agent-texts/project-agent-texts.d.mts.map +1 -0
- package/dist/agent-texts/project-agent-texts.mjs +29 -0
- package/dist/agent-texts/project-agent-texts.mjs.map +1 -0
- package/dist/agent-texts/project-child-text-agent-texts.d.mts +5 -0
- package/dist/agent-texts/project-child-text-agent-texts.d.mts.map +1 -0
- package/dist/agent-texts/project-child-text-agent-texts.mjs +26 -0
- package/dist/agent-texts/project-child-text-agent-texts.mjs.map +1 -0
- package/dist/agent-texts/projects-agent-texts.d.mts +4 -0
- package/dist/agent-texts/projects-agent-texts.d.mts.map +1 -0
- package/dist/agent-texts/projects-agent-texts.mjs +15 -0
- package/dist/agent-texts/projects-agent-texts.mjs.map +1 -0
- package/dist/agent-texts/raw-agent-texts.d.mts +4 -0
- package/dist/agent-texts/raw-agent-texts.d.mts.map +1 -0
- package/dist/agent-texts/raw-agent-texts.mjs +17 -0
- package/dist/agent-texts/raw-agent-texts.mjs.map +1 -0
- package/dist/agent-texts/text-editor-agent-texts.d.mts +6 -0
- package/dist/agent-texts/text-editor-agent-texts.d.mts.map +1 -0
- package/dist/agent-texts/text-editor-agent-texts.mjs +19 -0
- package/dist/agent-texts/text-editor-agent-texts.mjs.map +1 -0
- package/dist/api/api-constants.d.mts +9 -0
- package/dist/api/api-constants.d.mts.map +1 -0
- package/dist/api/api-constants.mjs +9 -0
- package/dist/api/api-constants.mjs.map +1 -0
- package/dist/api/api-index.d.mts +10 -0
- package/dist/api/api-index.d.mts.map +1 -0
- package/dist/api/api-index.mjs +121 -0
- package/dist/api/api-index.mjs.map +1 -0
- package/dist/api/api-types.d.mts +36 -0
- package/dist/api/api-types.d.mts.map +1 -0
- package/dist/api/api-types.mjs +2 -0
- package/dist/api/api-types.mjs.map +1 -0
- package/dist/api/commands/chat/chat-index.d.mts +3 -0
- package/dist/api/commands/chat/chat-index.d.mts.map +1 -0
- package/dist/api/commands/chat/chat-index.mjs +9 -0
- package/dist/api/commands/chat/chat-index.mjs.map +1 -0
- package/dist/api/commands/chat/get-context-info.d.mts +71 -0
- package/dist/api/commands/chat/get-context-info.d.mts.map +1 -0
- package/dist/api/commands/chat/get-context-info.mjs +130 -0
- package/dist/api/commands/chat/get-context-info.mjs.map +1 -0
- package/dist/api/commands/chat/hello-world.d.mts +63 -0
- package/dist/api/commands/chat/hello-world.d.mts.map +1 -0
- package/dist/api/commands/chat/hello-world.mjs +132 -0
- package/dist/api/commands/chat/hello-world.mjs.map +1 -0
- package/dist/api/commands/chat/tell-user.d.mts +57 -0
- package/dist/api/commands/chat/tell-user.d.mts.map +1 -0
- package/dist/api/commands/chat/tell-user.mjs +199 -0
- package/dist/api/commands/chat/tell-user.mjs.map +1 -0
- package/dist/api/commands/command-constants.d.mts +22 -0
- package/dist/api/commands/command-constants.d.mts.map +1 -0
- package/dist/api/commands/command-constants.mjs +17 -0
- package/dist/api/commands/command-constants.mjs.map +1 -0
- package/dist/api/commands/command-helpers.d.mts +47 -0
- package/dist/api/commands/command-helpers.d.mts.map +1 -0
- package/dist/api/commands/command-helpers.mjs +76 -0
- package/dist/api/commands/command-helpers.mjs.map +1 -0
- package/dist/api/commands/command-service-v1.d.mts +28 -0
- package/dist/api/commands/command-service-v1.d.mts.map +1 -0
- package/dist/api/commands/command-service-v1.mjs +122 -0
- package/dist/api/commands/command-service-v1.mjs.map +1 -0
- package/dist/api/commands/command-service.respec.d.mts +7 -0
- package/dist/api/commands/command-service.respec.d.mts.map +1 -0
- package/dist/api/commands/command-service.respec.mjs +66 -0
- package/dist/api/commands/command-service.respec.mjs.map +1 -0
- package/dist/api/commands/command-types.d.mts +48 -0
- package/dist/api/commands/command-types.d.mts.map +1 -0
- package/dist/api/commands/command-types.mjs +12 -0
- package/dist/api/commands/command-types.mjs.map +1 -0
- package/dist/api/commands/ibgib/get-ibgibs.d.mts +94 -0
- package/dist/api/commands/ibgib/get-ibgibs.d.mts.map +1 -0
- package/dist/api/commands/ibgib/get-ibgibs.mjs +219 -0
- package/dist/api/commands/ibgib/get-ibgibs.mjs.map +1 -0
- package/dist/api/commands/ibgib/ibgib-index.d.mts +3 -0
- package/dist/api/commands/ibgib/ibgib-index.d.mts.map +1 -0
- package/dist/api/commands/ibgib/ibgib-index.mjs +7 -0
- package/dist/api/commands/ibgib/ibgib-index.mjs.map +1 -0
- package/dist/api/commands/ibgib/mut8-ibgib.d.mts +135 -0
- package/dist/api/commands/ibgib/mut8-ibgib.d.mts.map +1 -0
- package/dist/api/commands/ibgib/mut8-ibgib.mjs +318 -0
- package/dist/api/commands/ibgib/mut8-ibgib.mjs.map +1 -0
- package/dist/api/commands/templates/api-function-info.template.d.mts +73 -0
- package/dist/api/commands/templates/api-function-info.template.d.mts.map +1 -0
- package/dist/api/commands/templates/api-function-info.template.mjs +161 -0
- package/dist/api/commands/templates/api-function-info.template.mjs.map +1 -0
- package/dist/api/commands/text/text-edit.d.mts +54 -0
- package/dist/api/commands/text/text-edit.d.mts.map +1 -0
- package/dist/api/commands/text/text-edit.mjs +170 -0
- package/dist/api/commands/text/text-edit.mjs.map +1 -0
- package/dist/api/commands/text/text-index.d.mts +3 -0
- package/dist/api/commands/text/text-index.d.mts.map +1 -0
- package/dist/api/commands/text/text-index.mjs +5 -0
- package/dist/api/commands/text/text-index.mjs.map +1 -0
- package/dist/api/commands/ui/ui-index.d.mts +3 -0
- package/dist/api/commands/ui/ui-index.d.mts.map +1 -0
- package/dist/api/commands/ui/ui-index.mjs +5 -0
- package/dist/api/commands/ui/ui-index.mjs.map +1 -0
- package/dist/api/commands/ui/update-css-variables.d.mts +48 -0
- package/dist/api/commands/ui/update-css-variables.d.mts.map +1 -0
- package/dist/api/commands/ui/update-css-variables.mjs +145 -0
- package/dist/api/commands/ui/update-css-variables.mjs.map +1 -0
- package/dist/api/function-infos.web.d.mts +15 -0
- package/dist/api/function-infos.web.d.mts.map +1 -0
- package/dist/api/function-infos.web.mjs +63 -0
- package/dist/api/function-infos.web.mjs.map +1 -0
- package/dist/assumptions.respec.d.mts +2 -0
- package/dist/assumptions.respec.d.mts.map +1 -0
- package/dist/assumptions.respec.mjs +41 -0
- package/dist/assumptions.respec.mjs.map +1 -0
- package/dist/common/project/project-constants.d.mts +38 -0
- package/dist/common/project/project-constants.d.mts.map +1 -0
- package/dist/common/project/project-constants.mjs +71 -0
- package/dist/common/project/project-constants.mjs.map +1 -0
- package/dist/common/project/project-helper.d.mts +127 -0
- package/dist/common/project/project-helper.d.mts.map +1 -0
- package/dist/common/project/project-helper.mjs +683 -0
- package/dist/common/project/project-helper.mjs.map +1 -0
- package/dist/common/project/project-types.d.mts +91 -0
- package/dist/common/project/project-types.d.mts.map +1 -0
- package/dist/common/project/project-types.mjs +31 -0
- package/dist/common/project/project-types.mjs.map +1 -0
- package/dist/common/prompt-functions.web.d.mts +90 -0
- package/dist/common/prompt-functions.web.d.mts.map +1 -0
- package/dist/common/prompt-functions.web.mjs +426 -0
- package/dist/common/prompt-functions.web.mjs.map +1 -0
- package/dist/common/settings/settings-constants.d.mts +33 -0
- package/dist/common/settings/settings-constants.d.mts.map +1 -0
- package/dist/common/settings/settings-constants.mjs +54 -0
- package/dist/common/settings/settings-constants.mjs.map +1 -0
- package/dist/common/settings/settings-helpers.d.mts +59 -0
- package/dist/common/settings/settings-helpers.d.mts.map +1 -0
- package/dist/common/settings/settings-helpers.mjs +253 -0
- package/dist/common/settings/settings-helpers.mjs.map +1 -0
- package/dist/common/settings/settings-types.d.mts +118 -0
- package/dist/common/settings/settings-types.d.mts.map +1 -0
- package/dist/common/settings/settings-types.mjs +13 -0
- package/dist/common/settings/settings-types.mjs.map +1 -0
- package/dist/constants.d.mts +34 -0
- package/dist/constants.d.mts.map +1 -0
- package/dist/constants.mjs +35 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/foo.d.mts +2 -0
- package/dist/foo.d.mts.map +1 -0
- package/dist/foo.mjs +19 -0
- package/dist/foo.mjs.map +1 -0
- package/dist/helpers.d.mts +137 -0
- package/dist/helpers.d.mts.map +1 -0
- package/dist/helpers.mjs +514 -0
- package/dist/helpers.mjs.map +1 -0
- package/dist/helpers.web.d.mts +324 -0
- package/dist/helpers.web.d.mts.map +1 -0
- package/dist/helpers.web.mjs +1133 -0
- package/dist/helpers.web.mjs.map +1 -0
- package/dist/helpers.web.respec.d.mts +2 -0
- package/dist/helpers.web.respec.d.mts.map +1 -0
- package/dist/helpers.web.respec.mjs +12 -0
- package/dist/helpers.web.respec.mjs.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/dist/respec-gib.node.d.mts +2 -0
- package/dist/respec-gib.node.d.mts.map +1 -0
- package/dist/respec-gib.node.mjs +211 -0
- package/dist/respec-gib.node.mjs.map +1 -0
- package/dist/spec-helper.node.respec.d.mts +13 -0
- package/dist/spec-helper.node.respec.d.mts.map +1 -0
- package/dist/spec-helper.node.respec.mjs +50 -0
- package/dist/spec-helper.node.respec.mjs.map +1 -0
- package/dist/storage/storage-helpers.web.d.mts +108 -0
- package/dist/storage/storage-helpers.web.d.mts.map +1 -0
- package/dist/storage/storage-helpers.web.mjs +757 -0
- package/dist/storage/storage-helpers.web.mjs.map +1 -0
- package/dist/storage/storage-types.web.d.mts +30 -0
- package/dist/storage/storage-types.web.d.mts.map +1 -0
- package/dist/storage/storage-types.web.mjs +2 -0
- package/dist/storage/storage-types.web.mjs.map +1 -0
- package/dist/types.web.d.mts +42 -0
- package/dist/types.web.d.mts.map +1 -0
- package/dist/types.web.mjs +2 -0
- package/dist/types.web.mjs.map +1 -0
- package/dist/ui/component/component-types.d.mts +225 -0
- package/dist/ui/component/component-types.d.mts.map +1 -0
- package/dist/ui/component/component-types.mjs +2 -0
- package/dist/ui/component/component-types.mjs.map +1 -0
- package/dist/ui/component/ibgib-component-service.d.mts +70 -0
- package/dist/ui/component/ibgib-component-service.d.mts.map +1 -0
- package/dist/ui/component/ibgib-component-service.mjs +201 -0
- package/dist/ui/component/ibgib-component-service.mjs.map +1 -0
- package/dist/ui/component/ibgib-dynamic-component-bases.d.mts +338 -0
- package/dist/ui/component/ibgib-dynamic-component-bases.d.mts.map +1 -0
- package/dist/ui/component/ibgib-dynamic-component-bases.mjs +1304 -0
- package/dist/ui/component/ibgib-dynamic-component-bases.mjs.map +1 -0
- package/dist/ui/ui-constants.d.mts +12 -0
- package/dist/ui/ui-constants.d.mts.map +1 -0
- package/dist/ui/ui-constants.mjs +93 -0
- package/dist/ui/ui-constants.mjs.map +1 -0
- package/dist/ui/ui-helpers.d.mts +42 -0
- package/dist/ui/ui-helpers.d.mts.map +1 -0
- package/dist/ui/ui-helpers.mjs +198 -0
- package/dist/ui/ui-helpers.mjs.map +1 -0
- package/dist/ui/ui-types.d.mts +13 -0
- package/dist/ui/ui-types.d.mts.map +1 -0
- package/dist/ui/ui-types.mjs +2 -0
- package/dist/ui/ui-types.mjs.map +1 -0
- package/dist/witness/agent/agent-constants.d.mts +97 -0
- package/dist/witness/agent/agent-constants.d.mts.map +1 -0
- package/dist/witness/agent/agent-constants.mjs +98 -0
- package/dist/witness/agent/agent-constants.mjs.map +1 -0
- package/dist/witness/agent/agent-helpers.d.mts +106 -0
- package/dist/witness/agent/agent-helpers.d.mts.map +1 -0
- package/dist/witness/agent/agent-helpers.mjs +601 -0
- package/dist/witness/agent/agent-helpers.mjs.map +1 -0
- package/dist/witness/agent/agent-one-file.app.d.mts +2 -0
- package/dist/witness/agent/agent-one-file.app.d.mts.map +1 -0
- package/dist/witness/agent/agent-one-file.app.mjs +8 -0
- package/dist/witness/agent/agent-one-file.app.mjs.map +1 -0
- package/dist/witness/agent/agent-one-file.d.mts +478 -0
- package/dist/witness/agent/agent-one-file.d.mts.map +1 -0
- package/dist/witness/agent/agent-one-file.mjs +1462 -0
- package/dist/witness/agent/agent-one-file.mjs.map +1 -0
- package/dist/witness/agent/agent-types.d.mts +83 -0
- package/dist/witness/agent/agent-types.d.mts.map +1 -0
- package/dist/witness/agent/agent-types.mjs +2 -0
- package/dist/witness/agent/agent-types.mjs.map +1 -0
- package/dist/witness/agent/agents-service-v1.d.mts +99 -0
- package/dist/witness/agent/agents-service-v1.d.mts.map +1 -0
- package/dist/witness/agent/agents-service-v1.mjs +453 -0
- package/dist/witness/agent/agents-service-v1.mjs.map +1 -0
- package/dist/witness/agent/function-info/function-info-one-file.d.mts +192 -0
- package/dist/witness/agent/function-info/function-info-one-file.d.mts.map +1 -0
- package/dist/witness/agent/function-info/function-info-one-file.mjs +192 -0
- package/dist/witness/agent/function-info/function-info-one-file.mjs.map +1 -0
- package/dist/witness/agent/gemini/agent-witness-gemini-v1.d.mts +51 -0
- package/dist/witness/agent/gemini/agent-witness-gemini-v1.d.mts.map +1 -0
- package/dist/witness/agent/gemini/agent-witness-gemini-v1.mjs +928 -0
- package/dist/witness/agent/gemini/agent-witness-gemini-v1.mjs.map +1 -0
- package/dist/witness/agent/gemini/gemini-agent-factory.d.mts +27 -0
- package/dist/witness/agent/gemini/gemini-agent-factory.d.mts.map +1 -0
- package/dist/witness/agent/gemini/gemini-agent-factory.mjs +144 -0
- package/dist/witness/agent/gemini/gemini-agent-factory.mjs.map +1 -0
- package/dist/witness/agent/gemini/gemini-constants.d.mts +36 -0
- package/dist/witness/agent/gemini/gemini-constants.d.mts.map +1 -0
- package/dist/witness/agent/gemini/gemini-constants.mjs +47 -0
- package/dist/witness/agent/gemini/gemini-constants.mjs.map +1 -0
- package/dist/witness/agent/gemini/gemini-helpers.d.mts +58 -0
- package/dist/witness/agent/gemini/gemini-helpers.d.mts.map +1 -0
- package/dist/witness/agent/gemini/gemini-helpers.mjs +210 -0
- package/dist/witness/agent/gemini/gemini-helpers.mjs.map +1 -0
- package/dist/witness/agent/gemini/gemini-types.d.mts +82 -0
- package/dist/witness/agent/gemini/gemini-types.d.mts.map +1 -0
- package/dist/witness/agent/gemini/gemini-types.mjs +3 -0
- package/dist/witness/agent/gemini/gemini-types.mjs.map +1 -0
- package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.d.mts +136 -0
- package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.d.mts.map +1 -0
- package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.mjs +334 -0
- package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.mjs.map +1 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace-helper.d.mts +35 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace-helper.d.mts.map +1 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace-helper.mjs +267 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace-helper.mjs.map +1 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.d.mts +134 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.d.mts.map +1 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mjs +389 -0
- package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mjs.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-constants.d.mts +2 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-constants.d.mts.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-constants.mjs +2 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-constants.mjs.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-helper.d.mts +104 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-helper.d.mts.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-helper.mjs +457 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-helper.mjs.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-types.d.mts +93 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-types.d.mts.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-types.mjs +98 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-types.mjs.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-v1.d.mts +73 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-v1.d.mts.map +1 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-v1.mjs +650 -0
- package/dist/witness/space/web-filesystem-space/web-filesystem-space-v1.mjs.map +1 -0
- package/generate-version-file.js +29 -0
- package/package.json +60 -0
- package/src/agent-texts/common-agent-texts.mts +61 -0
- package/src/agent-texts/primary-agent-texts.mts +32 -0
- package/src/agent-texts/project-agent-texts.mts +29 -0
- package/src/agent-texts/project-child-text-agent-texts.mts +30 -0
- package/src/agent-texts/projects-agent-texts.mts +17 -0
- package/src/agent-texts/raw-agent-texts.mts +18 -0
- package/src/agent-texts/text-editor-agent-texts.mts +20 -0
- package/src/api/api-constants.mts +8 -0
- package/src/api/api-index.mts +110 -0
- package/src/api/api-types.mts +36 -0
- package/src/api/commands/chat/chat-index.mts +10 -0
- package/src/api/commands/chat/get-context-info.mts +196 -0
- package/src/api/commands/chat/hello-world.mts +183 -0
- package/src/api/commands/chat/tell-user.mts +241 -0
- package/src/api/commands/command-constants.mts +17 -0
- package/src/api/commands/command-helpers.mts +105 -0
- package/src/api/commands/command-service-v1.mts +136 -0
- package/src/api/commands/command-service.respec.mts +72 -0
- package/src/api/commands/command-types.mts +71 -0
- package/src/api/commands/ibgib/get-ibgibs.mts +269 -0
- package/src/api/commands/ibgib/ibgib-index.mts +8 -0
- package/src/api/commands/ibgib/mut8-ibgib.mts +418 -0
- package/src/api/commands/templates/api-function-info.template.mts +212 -0
- package/src/api/commands/text/text-edit.mts +217 -0
- package/src/api/commands/text/text-index.mts +6 -0
- package/src/api/commands/ui/ui-index.mts +6 -0
- package/src/api/commands/ui/update-css-variables.mts +187 -0
- package/src/api/function-infos.web.mts +66 -0
- package/src/assets/fullscreen-dialog.html +18 -0
- package/src/assumptions.respec.mts +51 -0
- package/src/common/project/project-constants.mts +83 -0
- package/src/common/project/project-helper.mts +730 -0
- package/src/common/project/project-types.mts +121 -0
- package/src/common/prompt-functions.web.mts +447 -0
- package/src/common/settings/settings-constants.mts +72 -0
- package/src/common/settings/settings-helpers.mts +280 -0
- package/src/common/settings/settings-types.mts +137 -0
- package/src/constants.mts +39 -0
- package/src/foo.mts +13 -0
- package/src/helpers.mts +574 -0
- package/src/helpers.web.mts +1277 -0
- package/src/helpers.web.respec.mts +16 -0
- package/src/index.mts +3 -0
- package/src/respec-gib.node.mts +199 -0
- package/src/spec-helper.node.respec.mts +50 -0
- package/src/storage/storage-helpers.web.mts +728 -0
- package/src/storage/storage-types.web.mts +29 -0
- package/src/types.web.mts +42 -0
- package/src/ui/component/component-types.mts +241 -0
- package/src/ui/component/ibgib-component-service.mts +201 -0
- package/src/ui/component/ibgib-dynamic-component-bases.mts +1369 -0
- package/src/ui/ui-constants.mts +101 -0
- package/src/ui/ui-helpers.mts +222 -0
- package/src/ui/ui-types.mts +11 -0
- package/src/witness/agent/agent-constants.mts +122 -0
- package/src/witness/agent/agent-helpers.mts +681 -0
- package/src/witness/agent/agent-one-file.app.mts +8 -0
- package/src/witness/agent/agent-one-file.mts +1665 -0
- package/src/witness/agent/agent-types.mts +92 -0
- package/src/witness/agent/agents-service-v1.mts +482 -0
- package/src/witness/agent/function-info/function-info-one-file.mts +362 -0
- package/src/witness/agent/gemini/agent-witness-gemini-v1.mts +910 -0
- package/src/witness/agent/gemini/gemini-agent-factory.mts +135 -0
- package/src/witness/agent/gemini/gemini-constants.mts +79 -0
- package/src/witness/agent/gemini/gemini-helpers.mts +216 -0
- package/src/witness/agent/gemini/gemini-types.mts +88 -0
- package/src/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.mts +321 -0
- package/src/witness/space/metaspace/metaspace-webspace/metaspace-webspace-helper.mts +290 -0
- package/src/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mts +407 -0
- package/src/witness/space/web-filesystem-space/web-filesystem-space-constants.mts +1 -0
- package/src/witness/space/web-filesystem-space/web-filesystem-space-helper.mts +491 -0
- package/src/witness/space/web-filesystem-space/web-filesystem-space-types.mts +172 -0
- package/src/witness/space/web-filesystem-space/web-filesystem-space-v1.mts +670 -0
- package/tsconfig.json +17 -0
- package/tsconfig.test.json +10 -0
|
@@ -0,0 +1,728 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module storage-helpers.web.mts
|
|
3
|
+
*
|
|
4
|
+
* This is the storage abstraction that wraps indexed db.
|
|
5
|
+
*
|
|
6
|
+
* NOTE:
|
|
7
|
+
*
|
|
8
|
+
* I just want to say that callbacks are not very cool and that much of the
|
|
9
|
+
* ridiculousness of this code is due to this fact.
|
|
10
|
+
*
|
|
11
|
+
* That said, these functions try to ensure db is closed per function via global
|
|
12
|
+
* finally block. With nested promises and callbacks, this is a big f*n mess.
|
|
13
|
+
* But more importantly, this is why there aren't db.close() calls sprinkled
|
|
14
|
+
* throughout each function. But ths assumes that I am wiring up resolve/reject
|
|
15
|
+
* calls correctly through all the paths and this is far from certain.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { extractErrorMsg } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
|
|
19
|
+
|
|
20
|
+
import { GLOBAL_LOG_A_LOT, } from "../constants.mjs";
|
|
21
|
+
import { uint8ArrayToString } from "../helpers.web.mjs";
|
|
22
|
+
import { Dirent } from "./storage-types.web.mjs";
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
let logalot = GLOBAL_LOG_A_LOT;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* key/value pair interface for working with indexeddb
|
|
29
|
+
*/
|
|
30
|
+
export interface IndexedDBStorageDatum {
|
|
31
|
+
key: string;
|
|
32
|
+
/**
|
|
33
|
+
* may have to change this to work with binary array buffers.
|
|
34
|
+
*/
|
|
35
|
+
value: string | Uint8Array;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let initRequestCount: number = 0;
|
|
39
|
+
|
|
40
|
+
export async function askForPersistStorage(): Promise<void> {
|
|
41
|
+
const lc = `[${askForPersistStorage.name}]`;
|
|
42
|
+
try {
|
|
43
|
+
if (logalot) { console.log(`${lc} starting... (I: 94b9aca3633e3d4cd3d420329a9c7425)`); }
|
|
44
|
+
const _unusedtesting = await navigator.storage.persist();
|
|
45
|
+
if (navigator.storage?.persist) {
|
|
46
|
+
const alreadyPersisted = await navigator.storage.persisted();
|
|
47
|
+
if (alreadyPersisted) {
|
|
48
|
+
if (logalot) { console.log(`${lc} navigator.storage is already persisted (I: 2e55a7106e6d07715356b5feb5300b25)`); }
|
|
49
|
+
} else {
|
|
50
|
+
if (logalot) { console.log(`${lc} navigator.storage not already persisted. asking navigator.storage for persist... (I: 78086d15e2e94c14a0028c584099d715)`); }
|
|
51
|
+
const persisted = await navigator.storage.persist();
|
|
52
|
+
if (logalot) { console.log(`${lc} navigator.storage persist: ${persisted} (I: 923eb26c2c3240c9b5659c3266388071)`); }
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
if (logalot) { console.warn(`${lc} navigator.storage.persist not supported. (W: f5a9c3a8f7614d30b9f205f3f6c61b34)`); }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
60
|
+
throw error;
|
|
61
|
+
} finally {
|
|
62
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* initializes db ALWAYS but initializes store given by {@link storeName} ONLY
|
|
68
|
+
* WHEN VERSION IS HIGHER THAN EXISTING VERSION.
|
|
69
|
+
*
|
|
70
|
+
* @see {@link storageCreateStoreIfNotExist}
|
|
71
|
+
*/
|
|
72
|
+
export async function initializeStorage({
|
|
73
|
+
dbName,
|
|
74
|
+
storeName,
|
|
75
|
+
version,
|
|
76
|
+
logalot = false,
|
|
77
|
+
}: {
|
|
78
|
+
dbName: string,
|
|
79
|
+
storeName?: string,
|
|
80
|
+
version?: number,
|
|
81
|
+
logalot?: boolean,
|
|
82
|
+
}): Promise<void> {
|
|
83
|
+
const lc = `[${initializeStorage.name}][${dbName}][${storeName ?? 'no store name'}]`;
|
|
84
|
+
const uuid = crypto.randomUUID();
|
|
85
|
+
if (logalot) { console.time(lc + uuid); }
|
|
86
|
+
/** db variable outside try block for finally access in order to close it. */
|
|
87
|
+
let db: IDBDatabase | undefined = undefined;
|
|
88
|
+
try {
|
|
89
|
+
if (logalot) { console.log(`${lc} starting... (I: f35d4e1ba37252f14c8532fb861b1125)`); }
|
|
90
|
+
|
|
91
|
+
const prom = new Promise<void>((resolve, reject) => {
|
|
92
|
+
try {
|
|
93
|
+
if (logalot) { console.log(`${lc} starting... (I: 0aeddd9376daa0a044677ce4cf8a4c24)`); }
|
|
94
|
+
|
|
95
|
+
// Open a database connection
|
|
96
|
+
if (logalot) { console.timeLog(lc + uuid, 'opening... (I: e748b4ddb445d77cb10a7ba158b49125)') }
|
|
97
|
+
// so when we get here via storageCreateStoreIfNotExist function,
|
|
98
|
+
// the version is going to be a bumped number. so is this what is
|
|
99
|
+
// necessarily triggering the onblocked?
|
|
100
|
+
const openDBRequest = indexedDB.open(dbName, /*version*/version);
|
|
101
|
+
initRequestCount++;
|
|
102
|
+
console.log(`${lc} initRequestCount: ${initRequestCount} (I: 294d5f0b12ffe5512bacebe891824d25)`);
|
|
103
|
+
let storeAlreadyExisted: boolean | undefined = undefined;
|
|
104
|
+
openDBRequest.onupgradeneeded = (event: IDBVersionChangeEvent) => {
|
|
105
|
+
try {
|
|
106
|
+
db = (event.target as any).result as IDBDatabase;
|
|
107
|
+
if (logalot) { console.timeLog(lc + uuid, 'onupgradeneeded... (I: e748b4ddb445d77cb10a7ba158b49125)') }
|
|
108
|
+
|
|
109
|
+
// Create a store if it doesn't exist. note that
|
|
110
|
+
// db.createObjectStore can only be called within this
|
|
111
|
+
// onupgradeneeded handler.
|
|
112
|
+
if (storeName) {
|
|
113
|
+
if (!db.objectStoreNames.contains(storeName)) {
|
|
114
|
+
storeAlreadyExisted = false;
|
|
115
|
+
db.createObjectStore(storeName, { keyPath: 'key' });
|
|
116
|
+
} else {
|
|
117
|
+
storeAlreadyExisted = true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error(`${lc}[openDBRequest.onupgradeneeded] ${extractErrorMsg(error)} (E: 4a5fa1b0850be47e28bee653da287325)`);
|
|
122
|
+
reject(error);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
openDBRequest.onblocked = (event: IDBVersionChangeEvent) => {
|
|
127
|
+
console.log(`${lc}[openDBRequest.onblocked] openDBRequest blocked...time wasted a bit here. version change event (old -> new): ${event.oldVersion} -> ${event.newVersion} (I: 9074ebf4afdba54d6f9d41b360b96a25)`);
|
|
128
|
+
console.dir(event);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* this handler fires independently of upgradeneeded
|
|
133
|
+
*/
|
|
134
|
+
openDBRequest.onsuccess = (ev) => {
|
|
135
|
+
try {
|
|
136
|
+
if (logalot) { console.log('init success (I: 297a5a71e405a0b56413af813f248d24)'); }
|
|
137
|
+
if (logalot) { console.timeLog(lc + uuid, 'onupgradeneeded... (I: e748b4ddb445d77cb10a7ba158b49125)') }
|
|
138
|
+
db = (ev.target as any).result as IDBDatabase;
|
|
139
|
+
if (storeName) {
|
|
140
|
+
storeAlreadyExisted ??= db.objectStoreNames.contains(storeName);
|
|
141
|
+
if (logalot) { console.log(`${lc} ${dbName} store "${storeName}" ${storeAlreadyExisted ? 'already exists' : 'does not exist'}. (I: db64712bc69c5287b1cf77af1fc13d24)`); }
|
|
142
|
+
}
|
|
143
|
+
resolve();
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.error(`${lc}[openDBRequest.onsuccess] ${extractErrorMsg(error)}`);
|
|
146
|
+
reject(error);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
openDBRequest.onerror = (event: any) => { // IDBRequestEvent but doesn't compile
|
|
151
|
+
debugger; // error initializeStorage openDBRequest.onerror
|
|
152
|
+
console.error(`${lc}[initRequest.onerror] ${extractErrorMsg(openDBRequest.error)} (E: 74cf09e9fba2dd9e41225e943c331124)`);
|
|
153
|
+
reject(openDBRequest.error); // same as below?
|
|
154
|
+
// reject(event.target.error);
|
|
155
|
+
};
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
158
|
+
debugger; // error
|
|
159
|
+
reject(error);
|
|
160
|
+
} finally {
|
|
161
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
await prom;
|
|
165
|
+
} catch (error) {
|
|
166
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
167
|
+
throw error;
|
|
168
|
+
} finally {
|
|
169
|
+
if (db) {
|
|
170
|
+
if (logalot) { console.log(`${lc} closing db ${dbName}... (I: 3f1c18eec567ea63f3927eef0f038925)`); }
|
|
171
|
+
(db as any).close();
|
|
172
|
+
if (logalot) {
|
|
173
|
+
console.log(`${lc} closing db ${dbName} complete. (I: bc3b2f504245d6203dbba6bd65d30325)`);
|
|
174
|
+
console.timeLog(lc + uuid, 'db closed. (I: e748b4ddb445d77cb10a7ba158b49125)')
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (logalot) {
|
|
178
|
+
console.log(`${lc} complete.`);
|
|
179
|
+
console.timeEnd(lc + uuid);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* wrapper for filtered indexedDB.databases() call basically
|
|
187
|
+
*
|
|
188
|
+
* @returns db info for given dbName
|
|
189
|
+
*/
|
|
190
|
+
export async function storageGetDBInfo({
|
|
191
|
+
dbName,
|
|
192
|
+
logalot = false,
|
|
193
|
+
}: {
|
|
194
|
+
dbName: string,
|
|
195
|
+
logalot?: boolean,
|
|
196
|
+
}): Promise<IDBDatabaseInfo | undefined> {
|
|
197
|
+
const lc = `[${storageGetDBInfo.name}]`;
|
|
198
|
+
|
|
199
|
+
const uuid = crypto.randomUUID();
|
|
200
|
+
if (logalot) { console.time(lc + uuid); }
|
|
201
|
+
try {
|
|
202
|
+
if (logalot) { console.log(`${lc} starting... (I: 8516795b20529d19eb6923defd7a0f24)`); }
|
|
203
|
+
const dbInfo = (await indexedDB.databases()).filter(x => x.name === dbName).at(0);
|
|
204
|
+
return dbInfo;
|
|
205
|
+
} catch (error) {
|
|
206
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
207
|
+
} finally {
|
|
208
|
+
if (logalot) { console.timeEnd(lc + uuid); }
|
|
209
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* wrapper that ensures indexeddb store exists
|
|
216
|
+
*/
|
|
217
|
+
export async function storageCreateStoreIfNotExist({
|
|
218
|
+
dbName,
|
|
219
|
+
storeName,
|
|
220
|
+
logalot = false,
|
|
221
|
+
}: {
|
|
222
|
+
dbName: string,
|
|
223
|
+
storeName: string,
|
|
224
|
+
logalot?: boolean,
|
|
225
|
+
}): Promise<void> {
|
|
226
|
+
const lc = `[${storageCreateStoreIfNotExist.name}]`;
|
|
227
|
+
const uuid = crypto.randomUUID();
|
|
228
|
+
if (logalot) { console.time(lc + uuid); }
|
|
229
|
+
/** db variable outside try block for finally access in order to close it. */
|
|
230
|
+
let db: IDBDatabase | undefined = undefined;
|
|
231
|
+
try {
|
|
232
|
+
if (logalot) { console.log(`${lc} starting... (I: 029f7caa8ea5ea08a865f3924c82b624)`); }
|
|
233
|
+
|
|
234
|
+
const dbInfo_viaIndexedDBDatabasesFn = (await indexedDB.databases()).filter(x => x.name === dbName).at(0);
|
|
235
|
+
if (!dbInfo_viaIndexedDBDatabasesFn) { throw new Error(`db (${dbName}) does not exist. can't create store (${storeName}) (E: 5b15f7aed6f7068d077b2c7ebcbe8524)`); }
|
|
236
|
+
|
|
237
|
+
let storeExists = false;
|
|
238
|
+
|
|
239
|
+
if (logalot) { console.timeLog(lc + uuid); }
|
|
240
|
+
|
|
241
|
+
await new Promise<void>((resolve, reject) => {
|
|
242
|
+
const openDBRequest = indexedDB.open(dbName);
|
|
243
|
+
openDBRequest.onsuccess = (ev: Event) => {
|
|
244
|
+
db = (ev.target as any).result as IDBDatabase;
|
|
245
|
+
storeExists = db.objectStoreNames?.contains(storeName);
|
|
246
|
+
if (logalot) { console.timeLog(lc + uuid, 'open db request'); }
|
|
247
|
+
resolve();
|
|
248
|
+
};
|
|
249
|
+
openDBRequest.onerror = (event: any) => { // IDBRequestEvent but doesn't compile
|
|
250
|
+
debugger; // error storageCreateStoreIfNotExist openDBRequest.onerror
|
|
251
|
+
console.error(`${lc}[openDBRequest.onerror] ${extractErrorMsg(openDBRequest.error)} (E: 63695744e9e59ff8019e04ceeb8e2524)`);
|
|
252
|
+
// reject(event.target.error); // same as openDBRequest.error?
|
|
253
|
+
reject(openDBRequest.error);
|
|
254
|
+
};
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
if (logalot) { console.timeLog(lc + uuid); }
|
|
258
|
+
|
|
259
|
+
if (storeExists) {
|
|
260
|
+
if (logalot) { console.log(`${lc} store ${storeName} already existed. (I: a2263b510c18240fc59fca54e3892324)`); }
|
|
261
|
+
return; /* <<<< returns early */
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// store does not exist, so get the version number, bump it, and in the upgradeneeded handler, create the store
|
|
265
|
+
const dbInfo = await storageGetDBInfo({ dbName, logalot }); // does not need db closed yet
|
|
266
|
+
if (logalot) { console.timeLog(lc + uuid, 'storageGetDBInfo complete'); }
|
|
267
|
+
if (!dbInfo) { throw new Error(`db (${dbName}) does not exist. can't create store (${storeName}) (E: c771db13fa28f67079aad45e1ab7e624)`); }
|
|
268
|
+
const version = dbInfo.version;
|
|
269
|
+
if (!version) { throw new Error(`db (${dbName}) has no version. can't create store (${storeName}) (E: 3d2ec52853ad99f92b19ac5aa7fbfe24)`); }
|
|
270
|
+
const newVersion = version + 1;
|
|
271
|
+
if (logalot) { console.log(`${lc} creating store ${storeName} with version ${newVersion} (I: 312b79f28243c650cf38935114f21e24)`); }
|
|
272
|
+
// we need to manually close db here before calling the inititalizeStorage
|
|
273
|
+
if (db) {
|
|
274
|
+
(db as any).close();
|
|
275
|
+
db = undefined;
|
|
276
|
+
} else {
|
|
277
|
+
throw new Error(`(UNEXPECTED) how did we get here with db falsy? (E: b561784879e19bac54b1c4936aff0c25)`);
|
|
278
|
+
}
|
|
279
|
+
await initializeStorage({ dbName, storeName, version: newVersion, logalot });
|
|
280
|
+
} catch (error) {
|
|
281
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
282
|
+
throw error; // why wasn't I rethrowing??
|
|
283
|
+
} finally {
|
|
284
|
+
if (db) {
|
|
285
|
+
if (logalot) { console.log(`${lc} closing db ${dbName}... (I: 3f1c18eec567ea63f3927eef0f038925)`); }
|
|
286
|
+
(db as any).close();
|
|
287
|
+
if (logalot) { console.log(`${lc} closing db ${dbName} complete. (I: bc3b2f504245d6203dbba6bd65d30325)`); }
|
|
288
|
+
}
|
|
289
|
+
if (logalot) { console.timeLog(lc + uuid); }
|
|
290
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* set key/value item
|
|
296
|
+
* helper for indexeddb storage.
|
|
297
|
+
*/
|
|
298
|
+
export async function storagePut({
|
|
299
|
+
dbName,
|
|
300
|
+
version,
|
|
301
|
+
storeName,
|
|
302
|
+
key,
|
|
303
|
+
value,
|
|
304
|
+
logalot = false,
|
|
305
|
+
}: {
|
|
306
|
+
dbName: string,
|
|
307
|
+
version?: number,
|
|
308
|
+
storeName: string,
|
|
309
|
+
key: string,
|
|
310
|
+
value: string | Uint8Array,
|
|
311
|
+
logalot?: boolean,
|
|
312
|
+
}): Promise<void> {
|
|
313
|
+
const lc = `[${storagePut.name}]`;
|
|
314
|
+
/** db variable outside try block for finally access in order to close it. */
|
|
315
|
+
let db: IDBDatabase | undefined = undefined;
|
|
316
|
+
try {
|
|
317
|
+
if (logalot) { console.log(`${lc} starting... (I: bf7316c244888cb8ead2d3aac1d9f625)`); }
|
|
318
|
+
|
|
319
|
+
const prom = new Promise<void>((resolve, reject) => {
|
|
320
|
+
try {
|
|
321
|
+
if (logalot) { console.log(`${lc} starting... (I: 81df59e3961d711ce5d8f2ae3e2f3824)`); }
|
|
322
|
+
|
|
323
|
+
const openDBRequest = indexedDB.open(dbName, /*version*/version);
|
|
324
|
+
openDBRequest.onsuccess = (event: any) => { // IDBOpenDBRequestEvent?
|
|
325
|
+
db = event.target.result as IDBDatabase;
|
|
326
|
+
try {
|
|
327
|
+
const store = db.transaction(storeName, 'readwrite').objectStore(storeName);
|
|
328
|
+
const data: IndexedDBStorageDatum = { key, value };
|
|
329
|
+
store.put(data);
|
|
330
|
+
resolve();
|
|
331
|
+
} catch (error) {
|
|
332
|
+
console.error(`${lc}[putRequest.onsuccess] ${extractErrorMsg(error)}`);
|
|
333
|
+
reject(error);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
openDBRequest.onerror = (event: any) => { // IDBRequestEvent?
|
|
338
|
+
debugger; // storagePut openDBRequest error
|
|
339
|
+
// is openDBRequest.error same as event.target.error?
|
|
340
|
+
console.error(`${lc}[putRequest.onerror] ${extractErrorMsg(openDBRequest.error)} (E: 7a946d99ede2b248df4dcfea4ac99724)`);
|
|
341
|
+
reject(openDBRequest.error);
|
|
342
|
+
};
|
|
343
|
+
} catch (error) {
|
|
344
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
345
|
+
reject(error);
|
|
346
|
+
} finally {
|
|
347
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
await prom;
|
|
352
|
+
} catch (error) {
|
|
353
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
354
|
+
throw error;
|
|
355
|
+
} finally {
|
|
356
|
+
if (db) {
|
|
357
|
+
if (logalot) { console.log(`${lc} closing db ${dbName}... (I: 438c6edced94b83a3478c71b08c6c325)`); }
|
|
358
|
+
(db as any).close();
|
|
359
|
+
if (logalot) { console.log(`${lc} closing db ${dbName} complete. (I: 0d081553b1eb53c65ade2cedb802cf25)`); }
|
|
360
|
+
}
|
|
361
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* get item via key
|
|
367
|
+
* helper for indexeddb storage.
|
|
368
|
+
*/
|
|
369
|
+
export async function storageGet({
|
|
370
|
+
dbName,
|
|
371
|
+
version,
|
|
372
|
+
storeName,
|
|
373
|
+
key,
|
|
374
|
+
logalot = false,
|
|
375
|
+
}: {
|
|
376
|
+
dbName: string,
|
|
377
|
+
version?: number,
|
|
378
|
+
storeName: string,
|
|
379
|
+
key: string,
|
|
380
|
+
logalot?: boolean,
|
|
381
|
+
}): Promise<string | undefined> {
|
|
382
|
+
const lc = `[${storageGet.name}]`;
|
|
383
|
+
/** db variable outside try block for finally access in order to close it. */
|
|
384
|
+
let db: IDBDatabase | undefined = undefined;
|
|
385
|
+
try {
|
|
386
|
+
if (logalot) { console.log(`${lc} starting... (I: f8ba7cd5801918a8580e91b7c90aa525)`); }
|
|
387
|
+
const prom = new Promise<string | undefined>((resolve, reject) => {
|
|
388
|
+
try {
|
|
389
|
+
if (logalot) { console.log(`${lc} starting... (I: 24163c4a11c8712097db45febaf9c724)`); }
|
|
390
|
+
|
|
391
|
+
// Retrieve the value later
|
|
392
|
+
const openDBRequest = indexedDB.open(dbName, version);
|
|
393
|
+
openDBRequest.onsuccess = (event: any) => { // IDBOpenDBRequestEvent?
|
|
394
|
+
db = event.target.result as IDBDatabase;
|
|
395
|
+
|
|
396
|
+
let store: IDBObjectStore;
|
|
397
|
+
try {
|
|
398
|
+
store = db.transaction(storeName).objectStore(storeName);
|
|
399
|
+
} catch (error) {
|
|
400
|
+
debugger; // error getting objectStore
|
|
401
|
+
console.error(`${lc}[openDBRequest.onsuccess][objectStore] ${extractErrorMsg(error)}`);
|
|
402
|
+
reject(error);
|
|
403
|
+
return; /* <<<< returns early */
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// Get the value using the key
|
|
407
|
+
const getRequest = store.get(key);
|
|
408
|
+
getRequest.onsuccess = (event: any) => { // IDBRequestEvent?
|
|
409
|
+
try {
|
|
410
|
+
let value = (event.target?.result as IndexedDBStorageDatum)?.value ?? undefined;
|
|
411
|
+
if (!value) {
|
|
412
|
+
resolve(value);
|
|
413
|
+
return; /* <<<< returns early */
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (logalot) { console.log('Retrieved value:', value); }
|
|
417
|
+
if (value instanceof Uint8Array) {
|
|
418
|
+
resolve(uint8ArrayToString(value as Uint8Array));
|
|
419
|
+
} else {
|
|
420
|
+
if (typeof value !== 'string') { throw new Error(`(UNEXPECTED) truthy, non-Uint8Array value is not a string? (E: 6a4ec24e2e5d9848f8b542bc2661dc24)`); }
|
|
421
|
+
resolve(value);
|
|
422
|
+
}
|
|
423
|
+
} catch (error) {
|
|
424
|
+
reject(error);
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
getRequest.onerror = (event: any) => {
|
|
429
|
+
debugger; // storageGet getRequest.onerror
|
|
430
|
+
const error = getRequest.error;
|
|
431
|
+
console.error(`${lc}[openDBRequest.onsuccess][getRequest.onerror] ${extractErrorMsg(error)}`);
|
|
432
|
+
reject(error);
|
|
433
|
+
};
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
openDBRequest.onerror = (event: any) => { // IDBRequestEvent but doesn't compile
|
|
437
|
+
debugger; // error indexeddb storageGet openDBRequest.onerror
|
|
438
|
+
// are openDBRequest.error and event.target.error the same?
|
|
439
|
+
console.error(`${lc}[openDBRequest.onerror] ${extractErrorMsg(openDBRequest.error)} (E: 074963a908fa9a075f01c73cae829224)`);
|
|
440
|
+
reject(openDBRequest.error);
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
} catch (error) {
|
|
444
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
445
|
+
reject(error);
|
|
446
|
+
} finally {
|
|
447
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
const result = await prom;
|
|
452
|
+
return result;
|
|
453
|
+
} catch (error) {
|
|
454
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
455
|
+
throw error;
|
|
456
|
+
} finally {
|
|
457
|
+
if (db) {
|
|
458
|
+
if (logalot) { console.log(`${lc} closing db ${dbName}... (I: a938fc22dfdc76b15f6926bc4d458225)`); }
|
|
459
|
+
(db as any).close();
|
|
460
|
+
if (logalot) { console.log(`${lc} closing db ${dbName} complete. (I: 18f2ec1557bc83ec4e2c5d5e72264525)`); }
|
|
461
|
+
}
|
|
462
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* checks if db exists. if store is provided, checks to see if that specific
|
|
468
|
+
* store exists in the db's schema.
|
|
469
|
+
*
|
|
470
|
+
* helper for indexeddb storage.
|
|
471
|
+
*/
|
|
472
|
+
export async function storageDBExists({
|
|
473
|
+
dbName,
|
|
474
|
+
store,
|
|
475
|
+
}: {
|
|
476
|
+
dbName: string,
|
|
477
|
+
store?: string,
|
|
478
|
+
}): Promise<boolean> {
|
|
479
|
+
const lc = `[${storageDBExists.name}]`;
|
|
480
|
+
/** db variable outside try block for finally access in order to close it. */
|
|
481
|
+
let db: IDBDatabase | undefined = undefined;
|
|
482
|
+
try {
|
|
483
|
+
if (logalot) { console.log(`${lc} starting... (I: 2b4373affa3841220f0b7ca690406624)`); }
|
|
484
|
+
|
|
485
|
+
const dbs = await window.indexedDB.databases();
|
|
486
|
+
const dbExists = dbs.some(db => db.name === dbName);
|
|
487
|
+
if (dbExists) {
|
|
488
|
+
if (store) {
|
|
489
|
+
return await new Promise((resolve, reject) => {
|
|
490
|
+
const openDBRequest = indexedDB.open(dbName);
|
|
491
|
+
openDBRequest.onsuccess = (event: any) => { // IDBOpenDBRequestEvent?
|
|
492
|
+
db = event.target.result as IDBDatabase;
|
|
493
|
+
const storeExists = db.objectStoreNames.contains(store);
|
|
494
|
+
resolve(storeExists);
|
|
495
|
+
};
|
|
496
|
+
openDBRequest.onerror = (event: any) => { // IDBRequestEvent but doesn't compile
|
|
497
|
+
debugger; // onerror
|
|
498
|
+
db = openDBRequest.result;
|
|
499
|
+
const { error } = event.target;
|
|
500
|
+
console.error(`${lc}[openDBRequest.onerror] ${extractErrorMsg(openDBRequest.error)} (E: c783fe607451e46c1feae3a81e0f7924)`);
|
|
501
|
+
reject(error);
|
|
502
|
+
};
|
|
503
|
+
});
|
|
504
|
+
} else {
|
|
505
|
+
return true;
|
|
506
|
+
}
|
|
507
|
+
} else {
|
|
508
|
+
return false;
|
|
509
|
+
}
|
|
510
|
+
} catch (error) {
|
|
511
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
512
|
+
throw error;
|
|
513
|
+
} finally {
|
|
514
|
+
if (db) {
|
|
515
|
+
if (logalot) { console.log(`${lc} closing db ${dbName}... (I: 8782d9eea285cf9eb638d493a421a625)`); }
|
|
516
|
+
// for some reason, typescript incorrectly thinks db is type
|
|
517
|
+
// "never", so this any cast is necessary
|
|
518
|
+
(db as any).close();
|
|
519
|
+
if (logalot) { console.log(`${lc} closing db ${dbName} complete. (I: 76a0c5dea2643e2bb84c82c8446a8125)`); }
|
|
520
|
+
}
|
|
521
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* helper function equivalent to rm -rf in our filesystem space
|
|
527
|
+
*/
|
|
528
|
+
export async function storageRmRF({
|
|
529
|
+
dbName,
|
|
530
|
+
storeName,
|
|
531
|
+
pathToRm,
|
|
532
|
+
}: {
|
|
533
|
+
dbName: string;
|
|
534
|
+
storeName: string;
|
|
535
|
+
pathToRm: string;
|
|
536
|
+
}): Promise<void> {
|
|
537
|
+
const lc = `[${storageRmRF.name}]`;
|
|
538
|
+
/**
|
|
539
|
+
* turning it off for this function...note that this does not call any other
|
|
540
|
+
* functions in this file that would be affected.
|
|
541
|
+
*/
|
|
542
|
+
const logalotInitDebug = logalot;
|
|
543
|
+
// logalot = false;
|
|
544
|
+
if (logalot) { console.log(`${lc} starting... (I: c7e4cb759789ece0a8189d7dfb4d2a24)`); }
|
|
545
|
+
/** db variable outside try block for finally access in order to close it. */
|
|
546
|
+
let db: IDBDatabase | undefined = undefined;
|
|
547
|
+
return new Promise<void>((resolve, reject) => {
|
|
548
|
+
try {
|
|
549
|
+
if (!dbName) { throw new Error(`(UNEXPECTED) dbName falsy? (E: ed336d88c9c4e8d4916b29356dc58324)`); }
|
|
550
|
+
if (!storeName) { throw new Error(`(UNEXPECTED) storeName falsy? (E: ad493bb79b63a192524b14c59a706524)`); }
|
|
551
|
+
if (!pathToRm) { throw new Error(`(UNEXPECTED) pathToRm falsy? (E: 88c9631d93467e17996946882254af24)`); }
|
|
552
|
+
const openDBRequest = indexedDB.open(dbName);
|
|
553
|
+
|
|
554
|
+
openDBRequest.onerror = () => {
|
|
555
|
+
debugger; // error
|
|
556
|
+
if (openDBRequest.result) { // Only close if a DB object was obtained
|
|
557
|
+
(openDBRequest.result as IDBDatabase).close();
|
|
558
|
+
}
|
|
559
|
+
console.error(`${lc}[openDBRequest.onerror] ${extractErrorMsg(openDBRequest.error)} (E: 4c5ab71a765e61b4292008fd4fafe324)`);
|
|
560
|
+
reject(openDBRequest.error);
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
openDBRequest.onsuccess = () => {
|
|
564
|
+
db = openDBRequest.result;
|
|
565
|
+
const transaction = db.transaction(storeName, "readwrite");
|
|
566
|
+
const objectStore = transaction.objectStore(storeName);
|
|
567
|
+
|
|
568
|
+
// Use IDBKeyRange.lowerBound() for efficiency
|
|
569
|
+
const range = IDBKeyRange.lowerBound(pathToRm);
|
|
570
|
+
const openCursorRequest = objectStore.openCursor(range);
|
|
571
|
+
|
|
572
|
+
openCursorRequest.onerror = () => {
|
|
573
|
+
debugger; // error
|
|
574
|
+
console.error(`${lc}[openCursorRequest.onerror] ${extractErrorMsg(openCursorRequest.error)} (E: caefdda2bb95f92e9fb8d89ee412b524)`);
|
|
575
|
+
reject(openCursorRequest.error);
|
|
576
|
+
};
|
|
577
|
+
|
|
578
|
+
openCursorRequest.onsuccess = () => {
|
|
579
|
+
try {
|
|
580
|
+
let rmCount = 0;
|
|
581
|
+
// does it matter if the path is a dir vs. a file?
|
|
582
|
+
const cursor = openCursorRequest.result;
|
|
583
|
+
if (cursor) {
|
|
584
|
+
if (cursor.key.toString().startsWith(pathToRm)) {
|
|
585
|
+
const deleteRequest = cursor.delete();
|
|
586
|
+
rmCount++;
|
|
587
|
+
|
|
588
|
+
deleteRequest.onerror = () => {
|
|
589
|
+
debugger; // error
|
|
590
|
+
console.error(`${lc}[deleteRequest.onerror] ${extractErrorMsg(deleteRequest.error)} (E: abc031c53e5387322cd8909b3ada9b24)`);
|
|
591
|
+
reject(deleteRequest.error);
|
|
592
|
+
};
|
|
593
|
+
cursor.continue();
|
|
594
|
+
} else {
|
|
595
|
+
// No more keys starting with dirPath, we can stop
|
|
596
|
+
if (logalot) { console.log(`${lc} rmCount: ${rmCount} (I: e4bc613a5514c0942484b79267e16724)`); }
|
|
597
|
+
resolve();
|
|
598
|
+
}
|
|
599
|
+
} else {
|
|
600
|
+
if (logalot) { console.log(`${lc} cursor is falsy, so either we have no more records or had no records to begin with. (I: 9ff3aec6274416501a7baf6dcc5f2624)`); }
|
|
601
|
+
resolve();
|
|
602
|
+
}
|
|
603
|
+
} catch (error) {
|
|
604
|
+
console.error(`${lc}[openCursorRequest.onsuccess] ${extractErrorMsg(error)}`);
|
|
605
|
+
reject(error);
|
|
606
|
+
}
|
|
607
|
+
};
|
|
608
|
+
};
|
|
609
|
+
} catch (error) {
|
|
610
|
+
debugger; // error storageRmDir
|
|
611
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
612
|
+
reject(error);
|
|
613
|
+
}
|
|
614
|
+
}).finally(() => {
|
|
615
|
+
if (db) {
|
|
616
|
+
if (logalot) { console.log(`${lc} closing db ${dbName}... (I: 39b4ba83de4bdfd541e3384ebab27425)`); }
|
|
617
|
+
db.close();
|
|
618
|
+
if (logalot) { console.log(`${lc} closing db ${dbName} complete. (I: e4015b9436c4b2bc0ccf0e11e2037925)`); }
|
|
619
|
+
}
|
|
620
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
621
|
+
logalot = logalotInitDebug;
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* helper function equivalent to readdir in our filesystem space
|
|
627
|
+
*/
|
|
628
|
+
export async function storageReaddir({
|
|
629
|
+
dbName,
|
|
630
|
+
storeName,
|
|
631
|
+
dirPath,
|
|
632
|
+
withFileTypes = false,
|
|
633
|
+
}: {
|
|
634
|
+
dbName: string;
|
|
635
|
+
storeName: string;
|
|
636
|
+
dirPath: string;
|
|
637
|
+
withFileTypes?: boolean;
|
|
638
|
+
}): Promise<string[] | Dirent[]> {
|
|
639
|
+
const lc = `[${storageReaddir.name}]`;
|
|
640
|
+
/** db variable outside try block for finally access in order to close it. */
|
|
641
|
+
let db: IDBDatabase | undefined = undefined;
|
|
642
|
+
try {
|
|
643
|
+
const prom = new Promise<string[] | Dirent[]>((resolve, reject) => {
|
|
644
|
+
const openDBRequest = indexedDB.open(dbName);
|
|
645
|
+
|
|
646
|
+
openDBRequest.onerror = () => {
|
|
647
|
+
debugger; // error
|
|
648
|
+
// if (openDBRequest.result) { // Only close if a DB object was obtained
|
|
649
|
+
// (openDBRequest.result as IDBDatabase).close();
|
|
650
|
+
// }
|
|
651
|
+
reject(openDBRequest.error);
|
|
652
|
+
};
|
|
653
|
+
|
|
654
|
+
openDBRequest.onsuccess = () => {
|
|
655
|
+
db = openDBRequest.result;
|
|
656
|
+
const transaction = db.transaction(storeName, "readonly");
|
|
657
|
+
const objectStore = transaction.objectStore(storeName);
|
|
658
|
+
|
|
659
|
+
const normalizedDirPath = dirPath.endsWith("/") ? dirPath : dirPath + "/";
|
|
660
|
+
const range = IDBKeyRange.lowerBound(normalizedDirPath);
|
|
661
|
+
const openCursorRequest = objectStore.openCursor(range);
|
|
662
|
+
const entries: Set<string> = new Set();
|
|
663
|
+
const dirents: Dirent[] = [];
|
|
664
|
+
|
|
665
|
+
openCursorRequest.onerror = () => {
|
|
666
|
+
debugger; // error
|
|
667
|
+
console.error(`${lc}[openCursorRequest.onerror] ${extractErrorMsg(openCursorRequest.error)}`);
|
|
668
|
+
reject(openCursorRequest.error);
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
// cursor.continue() repeatedly calls this handler ick
|
|
672
|
+
openCursorRequest.onsuccess = () => {
|
|
673
|
+
try {
|
|
674
|
+
const cursor = openCursorRequest.result;
|
|
675
|
+
if (cursor) {
|
|
676
|
+
const key = cursor.key.toString();
|
|
677
|
+
if (key.startsWith(normalizedDirPath) && key !== normalizedDirPath) {
|
|
678
|
+
const relativePath = key.substring(normalizedDirPath.length);
|
|
679
|
+
const childSegment = relativePath.split("/")[0];
|
|
680
|
+
if (withFileTypes) {
|
|
681
|
+
// Determine if it's a file or directory
|
|
682
|
+
const isDirectory = relativePath.substring(childSegment.length).startsWith("/");
|
|
683
|
+
dirents.push({
|
|
684
|
+
name: childSegment,
|
|
685
|
+
isDirectory: () => isDirectory,
|
|
686
|
+
isFile: () => !isDirectory,
|
|
687
|
+
isBlockDevice: () => false,
|
|
688
|
+
isCharacterDevice: () => false,
|
|
689
|
+
isSymbolicLink: () => false,
|
|
690
|
+
isFIFO: () => false,
|
|
691
|
+
isSocket: () => false,
|
|
692
|
+
});
|
|
693
|
+
} else {
|
|
694
|
+
entries.add(childSegment);
|
|
695
|
+
}
|
|
696
|
+
cursor.continue();
|
|
697
|
+
} else if (!key.startsWith(normalizedDirPath)) {
|
|
698
|
+
resolve(withFileTypes ? dirents : Array.from(entries));
|
|
699
|
+
} else {
|
|
700
|
+
cursor.continue();
|
|
701
|
+
}
|
|
702
|
+
} else {
|
|
703
|
+
resolve(withFileTypes ? dirents : Array.from(entries));
|
|
704
|
+
}
|
|
705
|
+
} catch (error) {
|
|
706
|
+
console.error(`${lc}[openCursorRequest.onsuccess] ${extractErrorMsg(error)}`);
|
|
707
|
+
reject(error);
|
|
708
|
+
}
|
|
709
|
+
};
|
|
710
|
+
};
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
const result = await prom;
|
|
714
|
+
|
|
715
|
+
return result;
|
|
716
|
+
} catch (error) {
|
|
717
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
718
|
+
throw error;
|
|
719
|
+
} finally {
|
|
720
|
+
if (db) {
|
|
721
|
+
if (logalot) { console.log(`${lc} closing db ${dbName}... (I: 39b4ba83de4bdfd541e3384ebab27425)`); }
|
|
722
|
+
// for some reason, typescript incorrectly thinks db is type
|
|
723
|
+
// "never", so this any cast is necessary
|
|
724
|
+
(db as any).close();
|
|
725
|
+
if (logalot) { console.log(`${lc} closing db ${dbName} complete. (I: e4015b9436c4b2bc0ccf0e11e2037925)`); }
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|