Skip to content
Snippets Groups Projects
Select Git revision
  • efa705d9254ddf555b76c51a748b5d9fe0096e89
  • master default protected
  • dependabot/npm_and_yarn/nock-14.0.10
  • gh-pages
  • dependabot/npm_and_yarn/react-19.1.1
  • dependabot/npm_and_yarn/react-dom-19.1.1
  • dependabot/github_actions/actions/checkout-5
  • server-2025-08-01-57ada99c
  • server-2025-02-01-6100669a
  • server-2024-11-01-87cba042
  • server-2024-10-01-6875b7c8
  • dependabot/npm_and_yarn/path-to-regexp-8.2.0
  • server-2024-09-01-3d52575c
  • daily-tests-gha2
  • daily-tests-gha
  • server-2023-12-01-92d8fb8e
  • server-2023-11-01-a80c93fd
  • server-2023-10-01-31096085
  • coc-v2
  • server-2023-09-01-8edc3810
  • server-2023-08-01-75858a03
  • server-2025-08-03
  • server-2025-07-01
  • 5.0.2
  • 5.0.1
  • 5.0.0
  • server-2025-06-01
  • server-2025-05-01
  • server-2025-04-03
  • server-2025-03-02
  • server-2025-03-01
  • server-2025-02-02
  • server-2025-01-01
  • server-2024-12-01
  • server-2024-11-02
  • 4.1.0
  • server-2024-09-25
  • server-2024-09-02
  • server-2024-08-01
  • server-2024-07-01
  • 4.0.0
41 results

pypi-version.tester.js

  • loader.go 3.90 KiB
    package loader
    
    import (
    	"fmt"
    	"os"
    	"strings"
    
    	coredag "github.com/ipfs/go-ipfs/core/coredag"
    	plugin "github.com/ipfs/go-ipfs/plugin"
    	fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
    
    	ipld "github.com/ipfs/go-ipld-format"
    	logging "github.com/ipfs/go-log"
    	coreiface "github.com/ipfs/interface-go-ipfs-core"
    	opentracing "github.com/opentracing/opentracing-go"
    )
    
    var log = logging.Logger("plugin/loader")
    
    var loadPluginsFunc = func(string) ([]plugin.Plugin, error) {
    	return nil, nil
    }
    
    // PluginLoader keeps track of loaded plugins
    type PluginLoader struct {
    	plugins []plugin.Plugin
    }
    
    // NewPluginLoader creates new plugin loader
    func NewPluginLoader(pluginDir string) (*PluginLoader, error) {
    	plMap := make(map[string]plugin.Plugin)
    	for _, v := range preloadPlugins {
    		plMap[v.Name()] = v
    	}
    
    	if pluginDir != "" {
    		newPls, err := loadDynamicPlugins(pluginDir)
    		if err != nil {
    			return nil, err
    		}
    
    		for _, pl := range newPls {
    			if ppl, ok := plMap[pl.Name()]; ok {
    				// plugin is already preloaded
    				return nil, fmt.Errorf(
    					"plugin: %s, is duplicated in version: %s, "+
    						"while trying to load dynamically: %s",
    					ppl.Name(), ppl.Version(), pl.Version())
    			}
    			plMap[pl.Name()] = pl
    		}
    	}
    
    	loader := &PluginLoader{plugins: make([]plugin.Plugin, 0, len(plMap))}
    
    	for _, v := range plMap {
    		loader.plugins = append(loader.plugins, v)
    	}
    
    	return loader, nil
    }
    
    func loadDynamicPlugins(pluginDir string) ([]plugin.Plugin, error) {
    	_, err := os.Stat(pluginDir)
    	if os.IsNotExist(err) {
    		return nil, nil
    	}
    	if err != nil {
    		return nil, err
    	}
    
    	return loadPluginsFunc(pluginDir)
    }
    
    // Initialize initializes all loaded plugins
    func (loader *PluginLoader) Initialize() error {
    	for _, p := range loader.plugins {
    		err := p.Init()
    		if err != nil {
    			return err
    		}
    	}
    
    	return nil
    }
    
    // Inject hooks all the plugins into the appropriate subsystems.
    func (loader *PluginLoader) Inject() error {
    	for _, pl := range loader.plugins {
    		if pl, ok := pl.(plugin.PluginIPLD); ok {
    			err := injectIPLDPlugin(pl)
    			if err != nil {
    				return err
    			}
    		}
    		if pl, ok := pl.(plugin.PluginTracer); ok {
    			err := injectTracerPlugin(pl)
    			if err != nil {
    				return err
    			}
    		}
    		if pl, ok := pl.(plugin.PluginDatastore); ok {
    			err := injectDatastorePlugin(pl)
    			if err != nil {
    				return err
    			}
    		}
    		if pl, ok := pl.(plugin.PluginKeystore); ok {
    			err := injectKeystorePlugin(pl)
    			if err != nil {
    				return err
    			}
    		}
    	}
    	return nil
    }
    
    // Start starts all long-running plugins.
    func (loader *PluginLoader) Start(iface coreiface.CoreAPI) error {
    	for i, pl := range loader.plugins {
    		if pl, ok := pl.(plugin.PluginDaemon); ok {
    			err := pl.Start(iface)
    			if err != nil {
    				closePlugins(loader.plugins[i:])
    				return err
    			}
    		}
    	}
    	return nil
    }
    
    // StopDaemon stops all long-running plugins.
    func (loader *PluginLoader) Close() error {
    	return closePlugins(loader.plugins)
    }
    
    func closePlugins(plugins []plugin.Plugin) error {
    	var errs []string
    	for _, pl := range plugins {
    		if pl, ok := pl.(plugin.PluginDaemon); ok {
    			err := pl.Close()
    			if err != nil {
    				errs = append(errs, fmt.Sprintf(
    					"error closing plugin %s: %s",
    					pl.Name(),
    					err.Error(),
    				))
    			}
    		}
    	}
    	if errs != nil {
    		return fmt.Errorf(strings.Join(errs, "\n"))
    	}
    	return nil
    }
    
    func injectDatastorePlugin(pl plugin.PluginDatastore) error {
    	return fsrepo.AddDatastoreConfigHandler(pl.DatastoreTypeName(), pl.DatastoreConfigParser())
    }
    
    func injectIPLDPlugin(pl plugin.PluginIPLD) error {
    	err := pl.RegisterBlockDecoders(ipld.DefaultBlockDecoder)
    	if err != nil {
    		return err
    	}
    	return pl.RegisterInputEncParsers(coredag.DefaultInputEncParsers)
    }
    
    func injectKeystorePlugin(pl plugin.PluginKeystore) error {
    	return fsrepo.AddKeystore(pl.KeystoreTypeName(), pl.Open)
    }
    
    func injectTracerPlugin(pl plugin.PluginTracer) error {
    	tracer, err := pl.InitTracer()
    	if err != nil {
    		return err
    	}
    	opentracing.SetGlobalTracer(tracer)
    	return nil
    }